《C++ Primer》读书笔记第七章-2-类的其他特性 And 类的作用域
2017-09-16 20:17
288 查看
笔记会持续更新,有错误的地方欢迎指正,谢谢!
添加mutable关键字的数据成员,即使在const成员函数中,依旧可以被改变。
这个应用很少,了解即可~
1. 类之间的友元
2.令成员函数成为友元
这个之前就介绍过了:
3.函数重载和友元
a和b是重载函数,a是Screen的朋友,不代表b也是。一句话,把重载函数看成不同的函数。
4.友元函数和作用域
总结:必须在类外部 声明 友元函数之后,类才能去调用它:
例子:
类的定义分两步处理:编译器处理完类中的全部声明后,也就是直到类全部可见后才编译成员函数体(也就是{}中的内容)=>比如:参数列表中使用的名字都必须在使用前就可见。
不懂就看例子:
那我们能不能强行用类里面的height呢,当然可以:
并不建议这么写!!!不过你得懂,这就是C++烦人的地方。
那要是我就想用外面的那个全局变量妖艳贱货呢?也行。。。
同样,并不建议这么写!!!
建议的方法:直接换一个名字不就好了?
总结:访问类成员:使用 this->变量名 或 类名::变量名 可强制访问类成员,便可无视作用域的名字查找规则。另外,无类名加 ::变量名 表示全局查找(也就是用类外的那个变量)。
类的其他特性
包括:类型成员、类的成员的类内初始值、可变数据成员、内联成员函数,从成员函数返回*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++ Primer》读书笔记第七章-1-抽象数据类型 And 访问控制与封装
- 《C++ Primer》读书笔记第七章-3-构造函数再探 And 类的静态成员
- 《C++ Primer》读书笔记第六章-3-特殊特性 And 函数匹配 And 函数指针
- 《C++ Primer》读书笔记-第六章 05 特殊用途语言特性
- Understanding and using c pointers 第七章读书笔记
- Spring学习03--其他特性(减少配置、自动装配、scope作用域,延迟初始化)
- 《重构》读书笔记(七)——第七章 在对象之间搬移特性
- 《C++ Primer》读书笔记第三章-4-数组 And 多维数组
- 读书笔记《C++ Primer》第五版——第七章 类
- 《C++ Primer》读书笔记第六章-2-返回类型 And 函数重载
- 《C++ Primer》读书笔记第二章-1-基本内置类型 And 变量
- C++ Primer 读书笔记 – 第七章
- 《C++ Primer》读书笔记第十章-1-初识泛型算法 And Lambda
- C++ Primer 读书笔记 – 第七章
- 《C++ Primer》读书笔记第十章-2-再探迭代器 And 泛型算法结构
- 《C++ Primer 4th Edition》读书笔记 - Part III: Classes and Data Abstraction
- 《C++ Primer》读书笔记第二章-3-处理类型 And 自定义数据结构
- C++ Primer 读书笔记 – 第七章
- 《C++ Primer》读书笔记第六章-1-函数基础 And 参数传递
- 《C++ Primer》读书笔记第九章-1- 顺序容器概述 And 容器库概览