7.1定义抽象数据类型
struct Sales_data{
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
std::string isbn() const {return bookNo;}// 也可以写成 return this->bookNo
Sales_data& combine(const Sales_data&);
double avg_price() const;
}
Sales_data add(const Sales_data&,const Sales_data&);
在成员函数调用对象成员,是隐式的使用了this指针。
isbn函数的另一个关键的点是:参数列表后的const。这里const可以修改隐式this指针的类型。使得this指针变成指向常量的指针。
isbn函数也被称为常量成员函数,不能调整他的对象的内容。
该const用来修饰类的成员函数,类的设计者通常把成员函数声明为const,以表示它们不修改类对象。
a、const成员函数不可以修改类中的数据成员(mutable修饰的除外),编译时将进行检查,若const成员函数修改了类的数据成员,则无法通过编译;
b、声明为const的类对象,只能访问const成员函数,而非const的类对象可以访问任意的成员函数,包括const成员函数;
c、对于一个类,假如其中含有指针类型的数据成员,该类的const成员函数虽然不能直接修改该指针,但是可以修改该指针指向的内容,从而间接地改变类对象。所以,即使一个声明为const的类对象,在调用const成员函数时,也同样有可能改变自身的属性。
类作用域和成员函数:
在类的外部定义成员函数,成员函数定义必须和它的声明匹配,包括类似isbn函数的const。
7.14构造函数:
构造函数不能被声明为const。创建类的const对象时,构造函数完成初始化后,对象才能真的获得常量属性。所以构造函数可以在const对象的初始化时进行写值。
编译器创建的隐式的构造函数又叫合成构造函数
- 如果存在类内的初始值,用它来初始化成员
- 否则默认初始化改成员
编译器只有发现类内不包含构造函数时,才生成默认的构造函数。所以我们在创建构造函数的时候,要考虑是否自己显示的创建默认的构造函数。
同时要注意使用默认的构造函数会导致指针和数组这类的对象的值是未定义的,可能会出问题。
还有类的成员是另一个类时,如果被包含的类没有默认构造函数,那么编译器将无法初始化该成员。对于这样的类,我们必须自己定义默认构造函数。
C++11标准
= default的含义:
比如:person() = default;
= default既可以和声明一起放在类的内部。也可以作为定义放在类的外部。
如果放在内的内部,默认构造函数是内联的,如果它在类的外部,则该成员默认情况是不内联的。
构造函数初始值列表:
Sales_data(const std::string &s, unsigned n, double p):
bookNo(s), units_sold(n), revenue(p*n) { }
没出现在构造函数初始化列表的成员将通过相应的类内初始值初始化,或者执行默认初始化。
析构时注意使用动态内存的类,要手动free掉,否则会导致内存泄漏。
标签:const,函数,成员,Sales,C++,7.1,抽象数据类型,data,构造函数 From: https://www.cnblogs.com/hy227/p/16837690.html