这篇小文开始进入C++的面向对象的编程。OOP三大特性是:封装、继承和多态。其实更精确的说法是:基于对象的编程风格:类的封装性。面向对象的编程风格:继承性和多态性。
声明类之后就可以使用类指针和作为虚参的数据类型。
public可在程序任何地方取用,private只能在成员函数或类友元中取用。如果类对象或其引用在成员函数(比如拷贝构造函数)中出现,同样可以取用private成员。但是在类外的类对象是不能取用private成员的。
类内定义的成员函数自动视为inline。inline函数必须在头文件中定义。
构造函数和析构函数
若在构造函数内动态分配内存之后,需在析构函数中释放。
通常,对象赋值时默认的拷贝构造函数即可使用。但是如果在构造函数中动态分配了内存,那么需自定义拷贝构造函数。并在拷贝构造函数中再次动态分配内存,并对这个新的副本赋值。
类名::类名(const 类名 &rhs)
关键字mutable(可变)const(不变).
在成员函数中标注const,就向编译器表明该成员函数不会更动类对象的内容。const和非const函数也可以用来作为重载函数之间的区别。
在成员变量上标注mutable,就向编译器表明该成员变量不会更改类对象的常数性,即const函数中可以对mutable变量的值进行变更。
this指针用来在成员函数中寻址其调用者(整个对象)。
静态数据成员用来表示一份可共享的成员,可以在这个类型的所有对象中存取。
在外部使用静态数据成员应该加上class::标识符,因为静态数据成员属于类,而不属于任何对象。
静态数据成员可在声明时指定初值。
成员函数只有在不存取任何非静态成员时才能够被声明为static,同样的,静态函数属于类而不属于对象。
对静态的数据或函数,声明时加上static后,定义时就不需要再重复添加了。
运算符重载:1、不能引入新的运算符2、运算符操作数不可改变3、运算符优先级不可变4、至少有一个类类型操作数。也就是说不能为内置类型重新定义操作符。
typedef可以为某个类型设定另一个名字。
友元函数具有和类成员函数相同的存取权限。
如果只是操作某个成员,那么友元关系可以用public权限的函数取代。不过在操作点和矩阵等大量运算的函数时,使用友元可以提高效率。
成员函数指针,相比函数指针,它还要指出函数指针属于哪一个类。调用时需要同类的对象进行调用。
maximal munch规则:vector <vector<int>>//错误,>>将会被认为合法的运算符
vector <vector<int> >//正确,有空格
