您的位置:首页 > 编程语言 > C语言/C++

《C++ Primer》读书笔记第七章-2-类的其他特性 And 类的作用域

2017-09-16 20:17 288 查看
笔记会持续更新,有错误的地方欢迎指正,谢谢!

类的其他特性

包括:类型成员、类的成员的类内初始值、可变数据成员、内联成员函数,从成员函数返回*this,如何定义并使用类类型,友元类的更多知识。

类成员再探

可变数据成员

添加mutable关键字的数据成员,即使在const成员函数中,依旧可以被改变。

这个应用很少,了解即可~

类类型

对于一个类来说,我们必须定义它之后再去创建它的对象,不然编译器不知道给你这个对象分配多少内存。

友元再探

总结:都可以是朋友!

1. 类之间的友元

class Screen
{
friend class Window_mgr;
//Window_mgr可以访问Screen所有成员
}


2.令成员函数成为友元

这个之前就介绍过了:

class Screen
{
friend void Window_mgr::clear();
//跟人家的成员函数 做朋友
}


3.函数重载和友元

a和b是重载函数,a是Screen的朋友,不代表b也是。一句话,把重载函数看成不同的函数。

4.友元函数和作用域

总结:必须在类外部 声明 友元函数之后,类才能去调用它:

例子:

struct X
{
friend void f(){} //友元函数,可以定义在类内部(也可定义在类外部)
X(){ f(); } //默认构造函数调用f
//这种调用是错误的,因为f还没有在类外被声明

//俩成员函数的声明
void g();
void h();
}
void X::g(){f();} //错误,f没有被声明
void f(); //好,现在声明了
void X::h() {f();} //这样就对了


类的作用域

名字查找与类的作用域

类型名的定义:内层作用域可以重新定义外层作用域的名字,但若该名字表示类型,则类中不能再重新定义该名字。

typedef double Money;
string bal = "a";
class Accout
{
public:
Money balance()
{
return bal;//这里的bal是1。
//查找规则二(规则一在下方):若编译器处于编译函数体时期,遇到bal,则会先在
//函数中的此bal前方寻找bal,若未找到,就去类内部找,若还是找不到就在类外部找。
}
private:
Money bal = 1;
typedef double Money; //这样是错误的。但是编译器并不会报错,所以要自己小心。
};


类的定义分两步处理:编译器处理完类中的全部声明后,也就是直到类全部可见后才编译成员函数(也就是{}中的内容)=>比如:参数列表中使用的名字都必须在使用前就可见。

不懂就看例子:

int height = 1;
class Screen
{
public:
typedef string::size_type pos;
void f(pos height)//这里的height是1。
//查找规则一:若编译器处于声明期,遇到height,则会先在类中的此height前
//方寻找height,若未找到,就去类外部找,若还是找不到就报错。
{
cursor = width * height; //这里的height是1。
}
private:
pos cursor = 0;
pos height = 0, width = 0;
};


那我们能不能强行用类里面的height呢,当然可以:

void Screen::f(pos height)
{
cursor = width * this->height;
//或者
cursor = width * Screen::height;
}


并不建议这么写!!!不过你得懂,这就是C++烦人的地方。

那要是我就想用外面的那个全局变量妖艳贱货呢?也行。。。

void Screen::f(pos height)
{
cursor = width * ::height; //用的是外面那个全局的
}


同样,并不建议这么写!!!

建议的方法:直接换一个名字不就好了?

void Screen::f(pos temp)
{
cursor = width * height; //用的是类内的height。
}


总结:访问类成员:使用 this->变量名类名::变量名 可强制访问类成员,便可无视作用域的名字查找规则。另外,无类名加 ::变量名 表示全局查找(也就是用类外的那个变量)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ c++primer 读书笔记