1 定义在类内部的函数是隐式inline函数的。尽管所有成员都必须在类的内部申明,但是成员函数体可以定义在类内也可以定义在类外。
2 定义一个返回this对象的函数
class Sales_data {
std::string isbn() const {
return bookNo;
}
Sales_data &combine(const Sales_data &);
double avg_price() const;
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
Sales_data add(const Sales_data &, const Sales_data &);
std::ostream &print(std::ostream &, const Sales_data &);
std::istream &read(std::istream &, Sales_data &);
Sales_data& Sales_data::combine(const Sales_data &rhs) {
units_sold+=rhs.units_sold;
revenue+=rhs.revenue;
return *this;
}
3 每个类都分别定义它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数。
构造函数的名字和类名相同,构造函数没有返回值。类可以包含多个构造函数,不同的构造函数之间在参数数量或参数类型上有区别。
构造函数不能被声明成const。
当类没有声明任何构造函数时,编译器会自动生成默认构造函数。
4 访问控制和封装
定义在public说明符后的成员在整个程序内可被访问;
定义在private说明符后的成员可以被类成员函数访问,但是不能使用该类的代码访问;
struct关键字,成员都是public,class关键字,成员默认是private;
5 友元
类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或函数成为它的友元。
友元是当非成员函数需要访问类私有化成员时,但是这样会破坏类的封装性。
6 一个const成员函数如果以引用的形式返回*this,那么它的返回类型将是常量引用。
7 抑制构造函数定义的隐式转换
可以通过构造函数声明为explicit加以阻止;
发生隐式转换的一种情况是当我们执行拷贝形式的初始化时,此时我们只能使用直接初始化而不能使用explicit构造函数;
Sales_data item1(null_booke);
Sales_data item2=null_book; //不能将explicit构造函数用于拷贝形式初始化过程;
构造函数不能是const的,但字面值常量类的构造函数可以是constexpr的;
8 静态成员独立于任何对象。
静态成员可以是不完全类型,静态数据成员的类型可以是它的类类型。而非静态数据成员受到限制,只能声明成所属类的指针或引用;
Class Bar{
Static Bar mem1; //正确
Bar *mem2;//指针可以是不完全类型
Bar mem3;//错误,数据成员必须是完全类型
}