C++ priner 学习笔记之类

这里是学习C++ primer做的笔记

构造函数

下面是不同的构造函数形式

1
2
3
4
5
6
7
8
9
10
11
12
class Sales_data{
public:
Sales_data()=default;
Sales_data(const std::string &s,unsigned n, double p):
booksNo(s),units_sold(n),revenue(p*n){}
Sales_data(const std::string &s):
booksNo(s){}
private:
std::string bookNo;
unsigned units_sold=0;
double revenue=0.0;
};

友元

类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或者函数成为它的友元。如果类想把一个函数作为它的友元,只需要增加一条以friend关键字开始的函数声明语句即可:

1
2
3
4
5
6
7
8
9
class Sales_data{
//为Sales_data 的非成员函数所做的友元声明
friend Sales_data add(const Sales_data&, const Sales_data&);
public:
Sales_data()=default;
private:
std::string bookNo;
double revenue=0.0;
};

上面的add函数作为Sales_data类的友元函数,可以访问该类的privateprotected类型的成员,友元声明只能出现在类定义的内部,但在类内出现的具体位置不限。
类还可以把其它类定义成友元,也可以把其它类的成员函数定义成友元。比如Window_mgr类负责将Screen的内容设为空白,为了完成这个任务,需要访问Screen的私有成员,要想令这种访问合理,Screen需要把Window_mgr指定成它的友元:

1
2
3
4
5
class Screen{
//Window_mgr的成员可以访问Screen类的私有部分
friend class Window_mgr;
//...Screen类的剩余部分
};

类的其他特性

关于在函数后面添加const的作用:

  1. 表示该函数可以被常量对象调用,常量对象只能调用使用const函数
  2. 表示该函数可以操作成员,但是不可以修改数据成员的内容

有时候我们希望能够修改类的某个数据成员,即使是在一个const成员函数内,可以通过在变量的声明中加入mutable关键字做到这一点。一个可变数据成员永远不会是const,即使它是const对象的成员:

1
2
3
4
5
6
7
8
9
10
class Screen{
public:
void some_member() const;
private:
mutable size_t access_ctr;
};
void Screen::some_member() const
{
++access_ctr;
}

返回*this的成员函数

比如下面的代码:

1
2
3
4
5
6
7
8
9
10
class Screen{
public:
Screen &set(char);
Screen &set(pos,pos,char);
};
inline Screen &Screen::set(char c)
{
contents[cursor]=c;
return *this;
}

set成员返回值是条用set的对象的引用,返回引用的函数是左值,意味着这些函数返回的是对象本身而非对象的副本。【这里我对左值的理解变为可以放在等式的左边。。。】
有了上面的函数,我们可以把这样一系列的操作连接在一条表达式中:

1
myScreen.move(4,0).set('#');

如果set函数返回Screen而非Screen&,则调用set函数只能改变临时副本。
一个const成员函数如果以引用的形式返回*this,那么它的返回类型将是常量引用。

如果觉得有帮助,给我打赏吧!