《C++ Primer Plus(第六版)中文版》—第10章,对象和类
① 一般来说,类规范由两部分组成:
- 类声明:以数据成员的方式描述数据部分,以成员函数的方式描述公有接口
- 类方法定义:描述如何实现类成员函数
② 结构(struct)与类(class)具有相同的特性,它们之间唯一的区别是,结构的默认访问类型是public,而类为private。
③ 同一个类的所有对象共享同一组类方法,即每种方法只有一个副本;不同对象在调用同一个成员函数时,只是相当于传入不同的数据,返回的数据给到不同的对象;在oop中,调用成员函数被称为发送消息,因此将同样的消息发给同一个类的两个不同对象,将调用同一个方法,只是所用的数据不同。
④ 构造函数原型位于类声明的公有有部分。
⑤ 每次创建类对象(甚至使用new动态分配内存))时,C++都使用类构造函数:
Stock food = Stock("World Cabbage", 250, 1.25); //创建对象时显示地调用构造函数
Stock food("World Cabbage", 250, 1.25); //创建对象时隐式地调用构造函数
Stock *pstock = new Stock("World Cabbage", 250, 1.25); //使用new动态分配内存时调用构造函数
⑥ 无法使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的;因此构造函数被用来创建对象,而不能通过对象来调用。
⑦ 默认构造函数没有参数,因为声明中不包含值。定义默认构造函数的方式有两种,一种是给
Stock(const string & co = "Error", int n = 0, double pr = 0.0); //方式1:给已有构造函数的所有参数提供默认值
Stock(); //方式2:通过函数重载来定义另一个构造函数---一个没有参数的构造函数
⑧ 为类定义了构造函数(非默认构造函数)后,就必须为它提供默认构造函数;在设计类时,通常应提供对所有类成员做隐式初始化的默认构造函数。
Stock::Stock()
{
company = "no name";
shares = 0;
share_val = 0.0;
total_val = 0.0; //原本是通过在成员方法set_tot()中将shares的值和share_val的值相乘计算得到初始值的,这里也被一起初始化了
}
⑨ 在默认情况下,将一个对象赋给同类型的另一个对象时,C++将源对象的每个数据成员的内容复制到目标对象中相应的数据成员中。
Stock stock1("NanoSmart", 12, 20.0); //方式1
Stock stock2 = Stock("NanoSmart", 12, 20.0); //方式2
上述两种初始化对象的方式的区别是,方式2在使用某些编译器编译时,可能会允许调用构造函数来创建一个临时对象,然后将该临时对象复制到stock2中,并丢弃该临时对象,这时就会调用临时对象的析构函数。
Stock stock1("NanoSmart", 12, 20.0); //语句1
Stock stock1("NanoSmart_1", 12, 20.0); //语句2
上述语句1和语句2同时出现时,语句1表示创建一个对象并初始化它,而语句2由于stock1已经存在,将不会创建新的对象,而是创建一个临时对象,并把该临时对象的值赋给stock1,随后程序调用析构函数以删除该临时对象。
只要类方法不修改调用对象,就应将其声明为const
void show() const; //声明
void Stock::show() const //定义
⑩ 每个类可以有多个构造函数,但只能有一个析构函数,析构函数没有返回类型,也没有参数;如果构造函数使用了new,则必须提供使用delete的析构函数。
《C++ Primer Plus(第六版)中文版》—第10章,对象和类,this指针
C语言编程规范—杨文00059570—C语言编程规范(规范篇)