1.类和对象
1.1 声明类
class Person{ private: string name; int age; };
1.2 作为类实例的对象
1.3 使用句点运算符访问成员
1.4 使用指针运算符(->)访问成员
2.关键字public与private
3.构造函数
3.1 构造函数重载
3.2 默认构造函数:只要不需要参数构造对象,就是默认构造函数,默认构造函数不一定没有一个形参。
4.析构函数
5.复制构造函数
5.1 浅拷贝:只复制指针的指,使得两个指针指向同一块内存。
5.2 复制构造函数为什么必须是引用:实参传给形参需要调用复制构造函数,用引用是为了防止复制构造函数反复调用自身,最后栈溢出。
6.移动构造函数
6.1 防止对临时对象的拷贝,将移动对象的内部数据“窃取”过来。
class MyString{ private: char* buffer; public: MyString(MyString&& str) { buffer = str.buffer; str.buffer = nullptr; } };
7.构造函数和析构函数的其他用途
7.1 不允许复制的类:将复制构造函数声明为私有的。
7.2 只能有一个实例的类:将构造函数、复制构造函数、赋值运算符定义为私有的。定义一个静态函数用于创建返回唯一的对象、
class President{ private: President(){} President(const President& other) ; President& operator=(const President& other); public: static President& GetInstance() { static President pre; return pre; } };
7.3 禁止在栈中定义对象:类中的数据庞大,必须创建在堆区。做法:将析构函数定义为私有的,这样在栈中定义对象将报错,必须定义成T* ptr = new T();
7.4 类构造函数的类型转换。只要能用一个参数构造一个类,就具有隐式转换的能力。
class Person{ private: int age; string name; public: Person(int age=10,name = "xxx") { } }; void DoSomething(Person p) { } int main() { Person p(10); DoSomething(10); }
编译器知道Person 类包含了一个将整数作为参数的构造函数,当向DoSomething传整数时,编译器将这个整数传给构造函数,进而构造对象。
使用explicit可避免隐式转换。
8. this指针
记录对象地址。
9. sizeof用于类
大小与结构体字节对齐规则有关。
10.结构不用于类的地方
默认访问属性:类是private、结构是public
默认继承方式:类是private、结构是public
11.声明友元:
11.1友元函数:
class Person{ private: friend void Display(Person& P); int age; public: Person(int age):age(age){} } void Display(Person& p) { cout<<p.age<<endl; } int main() { Person p; Display(p); }
11.2 友元类:
class Person{ private: friend class Utility; int age; public: Person(int age):age(age){} } class Utility { public: void Display(Person& p) { cout<<p.age<<endl; } }; int main() { Person p; Utility::Display(p); }
12.共用体
共用体内部成员共用一块内存,内存大小由最大成员决定。
一种共用体使用场景。
struct ComplexType { enum DataType { Int, Char }Type; union Value { int num; char alpha; Value(){} ~Value(){} }; };
13.对类和结构使用聚合初始化
Type ObjectName = {arg1,arg2,....,argN};
类满足聚合初始化的条件:只包含公有和非静态私有成员,而不包含私有或受保护的数据成员;不包含任何虚函数、只涉及公有继承,不包含用户自定义的构造函数。
标签:对象,age,C++,Person,int,private,public,构造函数 From: https://www.cnblogs.com/pape/p/18007119