1,声明和定义构造函数时不能写返回类型,否则报错;
2,定义成员函数时,返回类型放在最前面,然后才是类的作用域,const限定符(如果需要的话)放在花括号前面;
3,public, private与protected访问标号
public之后定义的成员称为公有成员,可以由程序的所有部分访问;
private之后定义的成员称为私有成员,只能由本类(的成员函数)访问;
protected之后定义的成员称为保护成员,只能由本类及本类的后代类访问。
访问标号持续有效,直到遇到下一个访问标号或结构体定义的右花括号为止。
class关键字定义的类,默认是private的;struct关键字定义的类,默认是public的。
4,const成员函数:
不能改变其所操作的对象的数据成员。
const必须同时出现在声明和定义中,若只出现在其中一处就会报编译错误。
5,构造函数的初始化列表
Person() :name(""), address("") {}
初始化列表跟在构造函数的形参表(上面的例子里的是空形参表)之后,并以冒号开头。
初始化的顺序是按照类中成员定义的顺序,而不是按照初始化列表中成员出现的顺序。
初始化数据成员与对数据成员赋值的含义是什么?有什么区别?
首先把数据成员按类型分类并分情况说明:
1.内置数据类型,复合类型(指针,引用)
在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的
2.用户定义类型(类类型)
结果上相同,但是性能上存在很大的差别。因为类类型的数据成员对象在进入函数体前已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,
调用构造函数,在进入函数体之后,进行的是对已经构造好的类对象的赋值,
又调用个拷贝赋值操作符才能完成(如果并未提供,则使用编译器提供的默认按成员赋值行为)
6,数据抽象:注重类型接口的编程技术,数据抽象允许程序员忽略类型如何表示的细节,而只考虑该类型可以执行的操作。
7,封装:实现与接口的分离,封装隐藏了类型实现的细节。C++用private实现封装。
8,类中的typedef:
class Screen
{
public:
typedef std::string::size_type index;//在类外可使用这个新名字
char get()const { return contents[cursor]; }
char get(index ht, index wd)const; //重载get
Screen(string new_contents, index new_cursor,index new_width, index new_height)
{
contents = new_contents;
width = new_width;
height = new_height;
}
private:
string contents;
index cursor;
index height,width;
};
这个类中用typedef定义了一个名为index的局部类型名字,这个定义放在public中,所以在程序的任何地方,包括类外都可以使用这个名字。
注意,在类外部使用时要加上域操作符。
/*******************************************************************/
// 验证在类中使用typedef
/*******************************************************************/
Screen::index cursor = 2; //index为在类中定义的别名
Screen::index width = 3;
Screen::index height = 4;
Screen MyScreen("HuangYang Love WHY", cursor, width, height);
cout << MyScreen.get(0, 3) << endl;
9,inline成员函数
直接在类中定义的函数为隐式的inline成员函数。
还可以将函数显示声明为inline,但是在类中只声明,不定义,然后在类外定义该函数。这样虽然是在类外定义的,但其仍然为inline函数。
对于显式的inline函数需要注意:
(1)inline关键字,既可以出现在类中的声明里,也可以出现在类外的定义里,还可以两个地方都写;
(2)inline成员函数的定义应该与类的定义放在同一头文件中,而不是像普通的成员函数那样放在源文件中,因为inline成员函数必须在每个调用该函数的源文件中都可见;
10,类的声明
可以声明一个类而不定义它。
class class_Y;//声明一个类
class class_X
{
private:
class_Y *y;
};
这种声明又称为前向声明,在声明之后、定义之前,该类是一个不完全类型。既已知它是一个类,但不知道它包含哪些成员。
对于不完全类型,不能定义该类型的对象,只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数
在类中定义不完全类型的数据成员也是非法的,但可以定义指向不完全类型的对象的指针。即如上例所示。
由此也可推出:
类不能具有自身类型的数据成员,但是可以有指向自身类型的指针或引用。