【C++ Primer 学习笔记】 chapter12 类

来源:互联网 发布:java 安防监控 编辑:程序博客网 时间:2024/05/29 12:56

chapter12  类


12.1 类的定义和声明


1)将关键字const加在形参表之后,就可以将成员函数声明为常量:
 double avg_price()const;
 const成员不能改变其所操作对象的数据成员,const必须同时出现在声明和定义中,若只出现在其中一处,就会出现一个编译时错误;
2)类背后蕴涵的基本思想是数据抽象和封装;
3)将一个类成员函数定义为内联函数,有三种方式
 1> 将函数的定义写在类定义体内部
 2> 在类定义体内部的函数声明上用inline显式指定
 3> 在类定义体外部的函数定义上用inline显式指定

 

12.2 隐含的类型指针

 

1)在const成员函数中,this的类型是一个指向const类类型对象的const指针。既不能改变this所指向的对象,也不能改变this所保存的地址;
2)不能从const成员函数返回指向类对象的普通引用。Const成员函数只能返回*this作为一个const引用;
3)可以通过声明为mutable来实现对类的数据成员的修改(甚至在const成员函数内),将关键字mutable放在成员声明之前:
mutable size_t access_ctr;
4) 可变数据成员永远都不能为const,甚至当它是const对象的成员时也如此,因此const成员函数可以改变mutable成员;

 

12.3 类的作用域


1)即使两个类具有完全相同的成员列表,它们也是不同的类型。每个类的成员不同于任何其他类(或任何其他作用域)的成员;
2)在类作用域之外,成员只能通过对象或指针分别使用成员访问操作符 . 或->来访问;
3)出现在类的定义体之外的成员定义必须指明成员出现在那个类中:
double Sales_item::avg_price()const
{……}
4)在定义于类外部的成员函数中,形参表和成员函数体出现在成员名之后,这些都是在类作用域中定义,所以可以不用限定而引用其他成员;
5)返回类型出现在成员名字前面,如果函数在类定义体之外定义,则用于返回类型的名字在类作用域之外,如果返回类型使用由类定义的类型,则必须使用完全限定名;
6)类定义实际上式在两个阶段中处理:
首先,编译成员声明;
只有在所有成员出现之后,才编译它们的定义本身;
7)类成员定义中的查找:
首先检查成员函数局部作用域中的声明;
如果在成员函数中找不到该名字的声明,则检查对所有类成员的声明;
如果在类中找不到该名字的声明,则检查在此成员函数定义之前的作用域中出现的声明;
8)使用相同名字来表示形参和成员,可能导致类的成员被屏蔽,但是仍然可以通过用类名来限定成员名或显式使用this指针使用它;


12.4 构造函数


1)构造函数初始化式只在构造函数的定义中而不是声明中指定;
2)省略初始化列表并在构造函数的函数体内对数据成员赋值是合法的;
3)没有默认构造函数的类类型成员,以及const或引用类型的成员,都必须在构造函数初始化列表中进行初始化;
4)成员被初始化的次序就是定义成员的次序;
5)内置和复合类型的成员,如指针和数组,只对定义在全局作用域中的对象初始化;
6)使用默认构造函数定义一个对象的正确方式是去掉最后的空括号:
sales_item myobj(); //error ,defines a function, not an object
sales_item myob ; // ok
7)可以通过将构造函数声明为explicit,来防止在需要隐式转换的上下文中使用构造函数;
8)explicit关键字只能用于类内部的构造函数声明上,在类的定义体外部所做的定义上不再重复它;

 

12.5 友元

 

1)友元可以使普通的非成员函数,或前面定义的其他类的成员函数,或整个类。将一个类设为友元,友元类的所有成员函数后可以访问授予友元关系的那个类的非公有成员;
2)类必须将重载函数集中每一个希望设为友元的函数都声明为友元;

 

12.6 static 类成员

1)可以通过作用域操作符从类直接调用static成员,或者通过对象、引用或指向该类类型对象的指针间接调用;
2)static成员是与特定类关联的,由该类的全体对象所共享,不是任意的对象的组成部分。
3)static数据成员必须在类定义体外部定义,且只定义一次,一般可将其放在类的实现文件中。
4)在类的定义体中初始化的const static数据成员,仍必须在类的定义体外进行定义,但定义时无需再制定初始值。

 

原创粉丝点击