- 类和结构体的异同:结构体中成员默认为public,而class默认为private。
- 在类外定义成员函数(一般多于3行的函数):void Student::display() {...};而::display()或者display()表示全局函数。this指针指向当前对象。
- inline函数:如果类体中不包括循环等控制结构,C++系统自动将他们作为内置函数来处理。
- 带参数的构造函数:Box::Box(int h, int w, int len):height(h),width(w),lenght(len) {}
- 带默认参数的构造函数:Box::Box(int h=10, int w=10, int len=10); Box::Box(int h, int w, int len) {...}
- 带有 const 数据的构造函数:test(const string str):: testStr(str) {}
- 如果用户没有定义构造函数,系统自动生成一个无参数的空构造函数。
- 例:
- Box box1; // 调用默认无参数或者全部参数制定默认值的构造函数
- Box box2(10, 20, 30); // 调用带参数的构造函数
- 复制构造函数:Box(Box &) 或者Box(const Box &),使用的三种情况
- 一个对象去初始化另一个对象
- 当某个函数的参数是类的对象,调用该函数时会调用对应类的复制构造函数
- 如果某个函数的返回值是类的对象,调用该函数时会调用对应类的复制构造函数
- 析构函数:当对象的生命期结束时,会自动执行析构函数。先构造的后析构,相当于一个栈,先进后出。
- 析构函数调用说明:
- (1) 在全局范围内中定义的对象在main函数执行完毕或者调用exit函数时,调用析构函数
- (2) 函数中局部对象是在函数结束调用析构函数
- (3) 静态(static)局部对象,在函数第一次被使用时析构一次,在main函数结束或者调用exit函数结束程序,才调用构造函数。
- 对象数组初始化:
- Student Stu[3] = {{101, 17, 87}, {102, 18, 88}, {103, 19, 89}}; // 同样调用构造函数赋值
- Student Stu[3] = {Student(101, 17, 87),Student(102, 18, 88),Student(103, 19, 89)};
- 指向对象成员的指针:
- 由于成员函数是类的一个成员,所以指向成员函数的指针也应该是属于对应的类,而不是某个对象。
- 定义指向成员函数的指针形式:函数返回值类型 (类名::*指针变量名) (参数列表)
- 使指针指向一个公用成员函数:指针变量 =& 类名::成员函数名
- 例如:
- void(Time::*p)();p=&Time::get_time;(尽量不要省略&) 而不是 p=&t1.get_time; 成员函数不存放在对象的空间中,而是存放在对象外的空间中。
- 调用指向成员函数的指针:(t1.*p3)();
- 共用数据的保护
- 1. 常对象: 类名 const/const 类名 对象名([实参表]),
- 例如:const Time/Time const t1(11,12,13); // 如果一个对象被声明为常对象,则不能调用该对象的非const型的成员函数。
- 2. 如果非要修改在常对象中的某个数据成员的值,用mutable来声明该变量:mutable int count;
- 3. 常对象成员:const int hour;
- Time::Time(int h) {hour=h}//非法;
- Time::Time(int h):hour(h) {}//通过参数初始化方式
- 1. 常对象: 类名 const/const 类名 对象名([实参表]),
- 指向对象的常指针:
- Time * const ptrl = &t1; // 声明的时候同时初始化
- 指向常对象的指针:char c1 = "a"; const char *ptrl = &c1; *p = 'b'; // 错误;c='b';//可行
- 如果希望任何情况都不改变c1的值,则将c1定义为const char c1='a';
- 指向常对象的指针本身可以改变的,如const Time *p = &t1; p=&t2; 只是p不能改变对象的值。
- const char str[] = "Hello"; void fun(char *ptr); fun(str); // 访问非法,实参是const变量的地址
- 函数形参为非const型变量的指针只能指向非const指针
- 对象的动态建立和释放
- Box *pt = new Box(11,22,33); delete pt;
- 对象的赋值(对已经存在的对象):Box box1, box2; box1 = box2;
- 对象的拷贝/复制(从无到有建立新的对象):Box box1(box2) 或者 Box box1=box2; // 调用复制构造函数 copy constructor, 未定义时系统会自动生成一个
- 静态数据成员:
- 不属于某个对象,在所有对象之外单独开辟空间。
- 只能在类体外进行初始化:int Box::height = 10; 通过对象名或者类名引用静态数据成员:box1.height或者Box::height;
- 静态成员函数
- 没有this指针,所以它不能访问本类中的非静态成员。同理,使用对象名或者类名进行引用:box1.volume()或者Box::volume();
- 尽可能只用静态成员函数引用静态数据而不引用非静态数据成员
- 友元:
- 1. 普通函数声明为友元函数: friend void display(Time &) //放在Time的公共函数中
- 2. 友元成员函数:类与类之间,需要提前引用声明。P303
- 3. 友元类:在类A中声明类B为其友元类,friend B; // B类中的所有函数都是A类的友元函数,可以访问A的所有成员
- 类模板:
- 1. 声明:template <class numtype> // 虚拟类型为numtype
- 2. 调用需要用实际类型名去取代虚拟的类型:Compare <int> compl(4, 7)
- 3. 如果类模板中的成员函数是在类模板之外定义:
- template <class numtype> //先声明 numtype Compare <numtype>::max() {...}
- 对象的周期:从它的构造结束开始,至它的析构开始为止。(如果构造函数中出现异常,那么这个对象就不存在)
C++ 类
最新推荐文章于 2023-10-29 20:04:26 发布