封装:
1、把属性和方法进行封装。
2、对属性和方法进行访问控制。
class和struct的区别:
class和struct的唯一区别是默认的访问权限不一样。struct的默认访问权限是public,class的默认访问权限是private。
访问控制符:
1、public:成员在整个程序内可以被访问,public成员定义类的接口。
2、private:成员可以被类的成员函数访问,但不能被使用该类的代码访问,private部分封装了类的实现细节。
3、protected:成员可以被类和派生类访问,但不能被使用该类的代码访问。
类的构造函数:
1、构造函数的名字与类名相同。
2、构造函数在定义时可以有参数也可以无参,但没有任何返回类型的声明。
3、构造函数在变量定义时自动调用。
class Test { public: Test() = default;//类中定义了有参构造函数后系统将不会产生默认构造函数,Test() = defualt可以重新产生默认构造函数。 Test(int num); };
类的析构函数:
1、析构函数的名字与类名相同,名字头加~。
2、析构函数没有参数也没有任何返回类型的声明。
3、析构函数在对象销毁时自动被调用。
class Test { public: ~Test(); };
类的拷贝构造函数:
class Test { public: Test(const Test &obj);//一种特殊的构造函数,用一个对象出事化另一个对象,也存在深浅拷贝问题,编译器提供的是浅拷贝 }; class Test2 { public: Test2(char name, int num); Test2(char name) :Test2(name, 0){} //委托构造函数 };
拷贝构造函数被调用的时机:
1. 当用类的一个对象去初始化该类的另一个对象(或引用)时系统自动调用拷贝构造函数实现拷贝赋值。
Test t1;
Test t2(t1);
Test t3 = t1;
2. 若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。
3. 当函数的返回值是类对象时,系统自动调用拷贝构造函数,同时返回一个匿名对象。
匿名对象的生命周期只存在于一行,当无类变量接时,将会直接调用析构函数;当有类变量接时,会直接将匿名变量转换成类变量。
类的组合:
class A { public: A(int index) { this->a = a; } private: int a; }; class B { public: B(int a1Init, int a2Init) :a1(a1Init), a2(a2Init), b(3)//类的初始化列表,含有其他类(带有参构造函数)和const变量必须使用类的初始化列表进行初始化 { ; } private: A a1; A a2; const int b; };
类的组合的调用顺序:
1、当类中有成员变量是其它类的对象时,首先调用成员变量的构造函数,调用顺序与声明顺序相同,之后调用自身类的构造函数。
2、析构函数的调用顺序与对应的构造函数调用顺序相反。