您的位置:首页 > 编程语言 > C语言/C++

C++ Primer 笔记9

2013-11-05 08:17 218 查看
1、每个类可以没有成员,也可以定义多个成员,成员可以是数据、函数或类型别名。

2、将关键字const加在形参列表之后,就可以将成员函数声明为常量,const必须同时出现在声明和定义中。

3、可以在类定义体内部指定一个成员为inline,作为其声明的一部分。或者,也可以在类定义体外部的函数定义上指定inline。

4、类的定义以分号结束,分号是必须得,因为在类定义之后可以接一个对象定义列表,定义必须以分号结束。例:class
Sales_item{...}accum, trans;

5、在const成员函数中,this的类型是一个指向const类类型对象的const指针。

6、有时,我们希望类的数据成员(甚至在const成员函数内)可以修改,这可以通过将它们声明为mutable来实现。
可变数据成员永远都不能为const,甚至当它是const对象的成员时也如此。

7、不管成员是否在构造函数初始化列表中显式初始化,类类型的数据成员总是在初始化阶段初始化。

8、没有默认构造函数的类类型的成员,以及const或引用类型的成员,不管是哪种类型,都必须在构造函数初始化列表中进行初始化。

9、成员被初始化的次序就是定义成员的次序。所以,按照与成员声明一致的次序编写构造函数初始化列表是个好主意。

10、为所有形参提供默认实参的构造函数也定义了默认构造函数, 只有当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数。
如果类包含内置或复合类型的成员,则该类不应该依赖于合成的默认构造函数。它应该定义自己的构造函数来初始化这些成员。

11、假定有一个NoDefault类,它没有定义自己的默认构造函数,却有一个接受一个string参数的构造函数,NoDafault没有默认构造函数,意味着:

①具有NoDafault成员的每个类的每个构造函数,必须通过传递一个初始的string值给NoDafault构造函数来显式地初始化NoDafault成员。

②编译器将不会为具有NoDafault类型成员的类合称默认构造函数。如果这样的类希望提供默认的构造函数,就必须显式地定义,并且默认构造函数必须显式地初始化其NoDafault成员。

③NoDafault类型不能用作动态分配数组的元素类型。

④NoDafault类型的静态分配数组必须为每个元素提供一个显式地初始化式。

⑤如果有一个保存NoDafault对象的容器,例如vector,就不能使用接受容器大小而没有同时提供一个元素初始化式的构造函数。

  
实际上,如果定义了其他构造函数,则提供一个默认构造函数几乎总是对的。通常,在默认构造函数中给成员提供的初始值应该指出该对象是“空”的。

12、使用默认构造函数定义一个对象的正确方式是去掉最后的空括号:

  Sales_item myobj; // ok, defines a class
object...

  Sales_item myobj();//oops, declares a function,
not an object!

  Sales_item myobj = Sales_item();//ok, create an
unnamed, empty Sales_item and use
to     
initialize  my obj

13、可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。

   
可以通过将构造函数声明为explicit,来防止在需要隐式转换的上下文中使用构造函数,
explicit关键字只能用于类内部的构造函数声明上。在类的定义体外部所做的定义上不再重复它。
当构造函数被声明为explicit时,编译器将不能使用它作为转换操作符。
通常,除非有明显的理由想要定义隐式转换,否则,单形参构造函数应该为explicit。将构造函数设置为explicit可以避免错误,并且当转换有用时,用户可以显式地构造对象。

14、友元声明可以出现在类中任何地方,友元不是授予友元关系的那个类的成员,所以它们不受其声明出现部分的访问控制影响。
通常,将友元声明成组地放在类定义的开始或结尾是个好主意。
友元可以是普通的非成员函数,或前面定义的其他类的成员函数,或整个类。将一个类设为友元,友元类的所有成员函数都可以访问授予友元关系的那个类的非公有成员。
当我们将成员函数声明为友元时,函数名必须用该函数所属的类名字加以限定。

15、 static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联。
static成员函数没有this形参,它可以直接访问所属类的static成员,但不能直接使用非static成员。 static成员遵循正常的公有/私有访问规则。
可以通过作用域操作符从类直接调用static成员,或者通过对象、引用、或指向该类类型对象的指针间接调用。

16、当我们在类的外部定义static成员时,无需重复指定static保留字,该保留字只出现在类定义体内部的声明处。
static成员函数不能被声明为const,也不能被声明为虚函数。

17、static数据成员必须在类定义体的外部定义(正好一次)。
只要初始化式是一个常量表达式,整型const static数据成员就可以在类的定义体中进行初始化。 const
static数据成员在类的定义体中初始化时,该数据成员仍必须在类的定义体之外进行定义。在类内部提供初始化式时,成员的定义不必再指定初始值。

18、static数据成员的类型可以是该成员所属的类类型。非static成员被限定声明为其自身类对象的指针或引用。
static数据成员可用作默认实参。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: