1、成员函数的声明必须在类的内部,它的定义既可以在类的内部也可以在类的外部,定义在类内部的函数是隐式的inline函数。
class A{ public: int getNum(){ return num; } //隐式inline函数 private: int num; };
2、成员函数通过this的隐式参数来访问调用它的那个对象。默认情况下,this的类型是指向类类型非常量版本的常量指针,因此我们不能把this绑定到一个常量对象上。
3、在成员函数参数列表后加上const关键字表示this是一个指向常量的指针,这样的成员函数称作常量成员函数。
class A{ public: int getNum() const { return num; } //常量成员函数 private: int num; };
4、构造函数用来初始化类对象的数据成员。在c++新标准中,在参数列表后面加上=default要求编译器生成构造函数。
5、用struct关键字,在定义第一个访问说明符之前的成员是public的;用class关键字,在定义第一个访问说明符之前的成员是private的。
6、一个可变数据成员永远不是const,即使它是const对象的成员。
class A{ public: A():num(0){} int getNum() const { return num; } void changeNum() const { ++num; } //是const对象的成员,但可修改 private: mutable int num; //可变数据成员 };
7、前向声明:仅声明类而暂时不定义它;在类声明之后定义之前是不完全类型,此时编译器知道是一个类,但不知道包含哪些成员。
8、友元关系不存在传递性。
9、成员初始化顺序与它们在类定义中的出现顺序一致,而与构造函数初始值列表中初始值的前后关系无关。
#include<iostream> using namespace std; class A{ public: A(int val):j(val),i(j){} //未定义的,i在j之前被初始化 void print(){ cout<<"i:"<<i<<endl; cout<<"j:"<<j<<endl; } private: int i; int j; }; int main(){ A a(5); a.print(); system("pause"); return 0; }
在我电脑上运行结果:
10、C++新标准可以定义委托构造函数,即用它所属类的其他构造函数执行它自己的初始化过程。
class A{ public: A(int val):i(val),j(i){} A():A(0){} //委托构造函数,在VS2013中支持 void print(){ cout<<"i:"<<i<<endl; cout<<"j:"<<j<<endl; } private: int i; int j; };
11、隐式的类类型转换:编译器只会自动执行一步类型转换。用explicit关键字阻止类类型的隐式转换,只对一个实参的构造函数有效,只能以直接初始化的形式使用。只能在类内声明构造函数时使用explicit关键字,在类外部定义时不应重复。
#include<iostream> #include<string> using namespace std; class A{ public: explicit A(string& s):str(s){} //阻止隐式转换 private: string str; }; int main(){ A a("aaa"); //错误 A b(string("aaa")); //正确,实参是一个显式构造的string对象 A c(static_cast<string>("aaa")); //正确,实参用static_cast执行了显式的转换 system("pause"); return 0; }