定义在类内部的函数是隐式的inline函数。
常量成员函数:默认情况下隐式的this的类型是指向类类型非常量版本的常量指针,即自身是常量,但是指向的对象不是常量,为了使得this能绑定到一个常量对象(如const),则在函数后面加上const。但是这样子就不可以改变调用它的对象的数据成员。
#include <iostream> using namespace std; class Text { public: int score = 10;//类内初始值。 Text() { score = 100; } //必须声明为const,否则main函数没办法调用这个成员函数。 int getScore() const { return score; } }; int main() { const Text text; cout << text.getScore() << endl; }
编译器首先编译成员的声明,再编译成员函数体。所以无须在意顺序。
构造函数:用于初始化类对象的数据成员。构造函数不可以声明为const。
不显示提供构造函数,则按默认构造函数来初始化
- 如果有类内初始值,用它来初始化成员。
- 否则,默认初始化该成员。
只有类没有声明任何构造函数时,编译器才会自动生成默认构造函数。所以,如果一个类在某种情况下需要控制对象初始化,则需要控制所有情况。一般来说,对于一个类一定要定义自己的默认构造函数。
构造函数:
Sales_data() = default; // C++11,编译器生成默认构造函数。 //构造函数初始值列表,当某个成员不在初始化列表时,会执行默认构造函数(先看类内初始值,没有再默认初始化) Sales_data(const std:string & s):bookNo(s) { }
C++的构造函数中是能够调用其他成员函数的。
- 构造函数也是成员函数;
- 当执行构造函数的时候,对象的数据成员的内存已经分配完成;
- 因此构造函数是能够调用其他函数的。
在在成员函数内调用构造函数, 都只能是产生一个无名对象,并不会对原有对象的成员值造成影响。若在构造函数内调用构造函数,除了是在初始化列表中,或是编译器自动合成的(父类的或类成员的)构造函数,也不会改变该对象的成员变量的值。因此在成员函数中不要调用构造函数。
友元:目的是让该类可以访问当前类的非公有成员。最好在类开始或结束前集中声明友元。
可以在类中自定义某种类型在类中的别名,这也存在访问限制,该成员必须先定义后使用。
内联函数inline可以在声明或定义处使用, 也可以同时使用,不过最好在定义处用。inline成员函数应该放在头文件中。
可变数据成员:
mutable size_t access_ctr
加上了mutable之后,这个变量永远不会是const, 即使是const对象的成员也可改变,一个const成员函数也可以改变这个对象的值。当我们提供一个类内初始值时,必须以符号=或花括号表示。
一个const成员函数如果以引用的方式返回*this,那么这个返回类型就是一个常量引用,则可能无法用来调用其他非const成员函数。
可以同时声明常量版本和非常量版本的成员函数,这时候会选择最佳匹配的。
类也可以先进行声明而不定义,这种声明叫做前向声明。声明之后定义之前是一个不完全类型。
类中的数据成员不能是这种类本身,但可以是指向这个类的指针或引用。
友元关系不具有传递性。可以让某个类或某个类的成员函数成为我这个类的友元。这个时候要注意类的声明和定义顺序。
要声明重载的多个函数为友元,则要分别独自声明。
友元声明和作用域:252页。友元函数可以在类里面定义,但在外面也同时还要声明。类里面定义的友元函数隐式内联。
不使用构造函数初始值列表,而是在构造函数体内赋值,则执行的是赋值操作而不是初始值操作。
如果成员是const,引用,或者某种未提供默认构造函数的类类型,我们必须通过构造函数初始值列表为这些成员提供初值。
成员的初始化顺序与类中定义顺序一一致,与构造函数初始值列表顺序无关。尽量避免用某些成员初始化其他成员。
构造函数也可以用默认参数的方法。
委托构造函数:当一个构造函数委托给另一个构造函数时,受委托的构造函数的初始值列表和函数体被依次执行。假如受委托的函数体包含有代码的话,将执行这些代码,然后控制权才会交还给委托者的函数体。
类类型转换和聚合类
静态成员函数不能使用const,函数体内也不能使用this指针。
静态成员是整个类共享的,可以通过作用域运算符::直接使用,也可以通过对象或指针来访问。成员函数可以直接使用静态成员。
在类的外部定义静态成员时,不可以重复static关键字。静态数据成员不是由构造函数初始化的。静态数据成员要在类外定义,并且通过::运算符即可直接访问到私有静态数据成员,同时也可以调用私有静态函数来定义私有静态数据成员(270页)。
静态数据成员的类内初始化。
C++回顾之类
最新推荐文章于 2022-10-20 17:07:31 发布