- 成员函数
std::string isbn() const {return bookNo;}
// std::string Sales_data::isbn(const Sales_data *const this) {return this->isbn}
编译器分2步处理类:编译成员声明;成员函数体。因此,成员函数随意使用数据成员,而无需在意成员出现的顺序
Sales_data sum = lhs
:默认情况下,拷贝类的对象是拷贝对象的数据成员默认构造函数:创建类的一个
const
对象时,直到构造函数完成初始化过程,对象才能真正获得其常量
属性
Sale_data() = default;
Sales_data(const string &s): bookNo(s) {}
使用
struct
和class
定义类的唯一区别是默认的访问权限友元:可以访问类的非共有成员,是类的接口,但不是类的成员。关键字
friend
class Sales_data{
friend int read(); //指定了访问权限
}
int read(); //类外声明
inline
函数可以有多次定义,一般应该相同。所以inline
成员函数定义和相应的类定义在同一个头文件中可变数据成员:
mutable
,即使对象是或函数是const
,也能改变类对象声明
Sales_data item1;
class Sales_data item1; //等价的
- 友元类、友元函数等:必须仔细组织程序的结构以满足声明和定义的彼此依赖关系
friend class Window_mgr;
friend void Window_mgr::clear();
//友元一定要在外部声明(类的友元声明不算通常的声明),定义在该类之后(友元类不必)
- 类的作用域:在类外部,一旦遇到类名,定义的剩余部分就在类的作用域之内了
void win::clear(){}
linux::type win:::clear(){}
如果成员函数是
const
、引用或某种未提供默认构造函数的类类型,必须通过构造函数初始值列表来初始化这些值
。因为构造函数体一旦开始执行,初始化就完成了。成员初始化顺序:与在类定义中出现的顺序一致
使用默认构造函数:
Sales_data obj;
不要在后面加上()
。否则,就是声明函数了转换构造函数:构造函数只接受一个实参
string null_book = "666";
item.combine(null_book);
item.combine("666"); //error :进行了2步转换 char*->string->sales_data
explict Sales_data(string &s); //抑制了隐式转换
item.combine(static_cast<Sales_data>(cin));
静态变量:
static
,类内声明加上static
,如果在类外定义则不能加static
。explict
也一样不完全类型:已经声明但是尚未定义的类型。该类型不能用于定义变量或类的成员,但是可以定义指针或引用