(一)综述:类是我们自己定义的数据类型
设计时要考虑的角度:
- 站在设计和实现的角度来考虑;
- 站在使用者的角度考虑;
- 父类,子类之间的考虑;
(二)explicit
首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).
(三) inline const mutable this static
在类定义中实现成员函数inline
class pro
{
public://类内inlineint GetNum(){return num1 + num2;}
private:int num1;int num2;
};
(四)成员函数末尾加const,告诉系统这个成员函数不会修改对象里任何成员变量的值等
const 定义的类对象只能调用const结尾的成员函数;末尾const成员函数,可以被const对象和非const成员调用
#include<iostream>
using namespace std;class A
{
public:void init(int num){a = num;}
protected:int a;};int main()
{const A aa;aa.init(100);
}
(五)mutable
使用mutable修饰的内容,永远处于可被修改的状态。
class A
{
public:void init(int num)const {a = num;}
protected:mutable int a;};
(六)返回自身对象的引用,this
class A
{
public:A& init(int num){this->a = num;return *this;}
protected:int a;};
编译器负责把这个对象的地址(&class)传递给成员函数中一个隐藏的this形参;在系统角度看来,任何对类成员直接访问都被看作成为是通过this做隐式调用的。
- this指针只能在成员函数中使用,全局函数,静态函数都不能使用this指针。
- 在普通成员函数中,this是一个指向非const对象的const指针 (class * const this)。
- 在const成员函数中,this是一个指向const对象的const指针 (const class * const this)。
(七)static成员
class A
{
public:A() {};~A() {};static int num ;//只声明了,但是没有分配内存static int getnum(){return num;}};
int A::num = 0;//分配内存并且类外初始化int main()
{A aa;aa.num = 100;cout << A::num << endl;cout << A::getnum() << endl;}
- 静态成员变量在类内声明的时候不能进行初始化操作,且没有分配内存。需要在类外进行分配内存并且初始化。
- 静态成员变量和静态成员函数可以通过类对象调用,也可以通过类名::(静态成员函数/静态成员)的方式调用。
static的特点:(可以修饰成员变量和成员方法)
1.随着类的加载而加载。
2.优先于对象存在。
3.被类的所有对象共享。(判断是否用static修饰,只需要看其是否被所有对象共享)
4.可以用对象名调用也可以直接通过类名调用。
5.static修饰的内容与类相关称之为类变量,非静态修饰的内容称之为实例变量。
static使用注意事项:
1.静态方法中没有this关键字。(静态修饰的内容是随着类的加载而加载,this随着对象的创建而存在,静态修饰的内容比对象先存在)。
2.静态方法只能访问静态的成员变量和静态的成员方法
静态方法:
成员变量:只能访问静态变量。
成员方法:只能访问静态成员方法。
非静态方法:
成员变量:即可以访问静态变量又可以访问非静态变量。
成员方法:既可以访问静态的方法又可以访问非静态的成员方法。
静态只能访问静态,非静态可以访问一切。
静态变量和成员变量的区别:
1.所属不同:
静态变量:属于类,类变量。
成员变量:属于对象,实例变量
2.存储位置不同
静态变量:方法区的静态区。
成员变量:堆内存。
3.生命周期不同
静态变量:随着类的加载而加载,随着类的消失而消失。
成员变量:随着对象的创建而存在,随着对象的消失而消失。
4.调用方式不同
静态变量:可以通过对象名调用也可以直接通过类名调用。
成员变量:只能通过对象名调用。