C++Primer读书笔记1
构造函数
Const 成员函数
将const关键字加在形参表之后,就可以将成员函数声明为常量,不能改变其所操作对象的数据成员,const必须同时出现在定义和声明中。
显示指定inline成员函数
class Screen
{
public:
Screen(void);
~Screen(void);
inlinevoid get(char ch);
};
inline void Screen::get(char ch)
{
cout<<ch<<endl;
}
可变数据成员
如果我们希望在const成员函数内修改成员变量,那么我们就把该成员声明为mutable。
class Screen
{
public:
mutableint num;
public:
voiddisplay() const;
};
void Screen::display() const
{
num++;
cout<<num<<endl;
}
void main()
{
Screen *a=new Screen();
a->num=1;
a->display();
getchar();
}
访问类的成员两种方法:
Screen *a=new Screen();
a->num=1;
a->display();
Screen temp;
temp.num=7;
temp.display();
构造函数初始化式
初始化列表以冒号开始,接着是一个以逗号分开的数据成员列表,每个数据成员后面跟一个放在括号的初始化式,初始化式只能在构造函数的定义中而不是在声明中定义。
没有默认构造函数的类类型成员,以及const或引用类型成员,必须使用构造函数初始化列表初始化列表,在构造函数体内初始化时行不通的,
class Screen
{
private:
inti;
const int ci;
int&ri;
public:
Screen(intii);
~Screen();
voiddisplay();
}
Screen::Screen(int ii):i(ii),ci(ii),ri(ii)
{
}
下面做法编译出错
Screen::Screen(int ii)
{
i=ii;
ci=ii;
ri=ii;
}
构造函数初始化成员列表的成员初始化顺序
成员初始化的次序就是定义成员的次序,第一个成员首先被初始化,然后是第二个,依次类推。
private:
intj;
inti;
Screen::Screen(int ii):j(ii),i(j)
用尚未初始化的j来初始化i。
默认构造函数
只要定义一个对象时没有初始化时,就需要使用默认构造函数,为所有形参提供默认实参的构造函数也定义了默认构造函数。
一个类只要定义了一个构造函数,编译器也不会再生成默认构造函数,只有当一个类没有定义构造函数时,编译器才会自动生成默认构造函数。
具有类类型的成员通过运行各自的默认构造函数来进行初始化,内置和复合类型的成员如指针和数组,只对定义在全局作用域的对象才初始化,当对象定义在局部作用域时不进行初始化。
隐式的类类型转化
class Sales_item{
public:
intunits_sold;
doublerevenue;
stringisbn;
Sales_item(conststring &book=""):isbn(book),units_sold(0),revenue(0.0)
{}
voiddisplay(Sales_item item);
};
void Sales_item::display(Sales_item item)
{
cout<<item.units_sold<<endl;
}
int main()
{
stringnull_book="helllo";
Sales_item *a=new Sales_item();
a->display(null_book);
getchar();
return0;
}
上述构造函数实现了,字符串到类类型的隐式转换,
可以通过将构造函数声明为explicit,防止在需要隐式转换的上下文中使用构造函数,explicit关键字只能用于类内部的构造函数上,在类的定义体外部不在重复,示例如下:
using namespace std;
class Sales_item{
public:
intunits_sold;
doublerevenue;
stringisbn;
explicitSales_item(const string&book=""):isbn(book),units_sold(0),revenue(0.0)
{}
voiddisplay(Sales_item item);
};
void Sales_item::display(Sales_item item)
{
cout<<item.units_sold<<endl;
}
int main()
{
stringnull_book="helllo";
Sales_item *a=new Sales_item();
a->display(null_book);
getchar();
return0;
}
未转换而显示地使用构造函数
class Sales_item{