IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Effective C++|Chapter 4:设计与声明 -> 正文阅读

[C++知识库]Effective C++|Chapter 4:设计与声明

Item 20:宁以pass-by-reference-to-const替代pass-by-value

  • 以下代码使用pass-by-value方法,调用validateStudent(Student s)的成本是“6次构造函数和6次析构函数”:1次Student copy构造函数调用,1次Student析构函数调用;由于Student继承Person,因此构造Student前需构造Person。1个Student对象有2个string,1个Person对象也有2个string,所以这里有对string对象的4次构造和4次析构调用。总共6次构造函数和6次析构函数的调用。

    class Person {
    public:
    	Person();
    	virtual ~Pearson();
    	...
    private:
    	string name;
    	string address;
    };
    class Student: public Person {
    public:
    	Student();
    	virtual ~Student();
    	...
    private:
    	string schoolName;
    	string schoolAddress;
    };
    
    bool validateStudent(Student s);
    Student plato;
    bool platoIsOK = validateStudent(plato);
    
  • 正确做法:pass by reference-to-const:【这还可以避免对象切割】

    bool validateStudent(const Student& s);
    
  • 对象切割示例:由于此处采用pass-by-value,printNameAndDisplay()无论传递的是什么类型的参数,函数接收的始终是Window类型,因此其内部的w.display();总是Window类型的调用。

    class Window {
    public:
    	...
    	string name() const;
    	virtual void display() const;
    };
    class WindowWithScrollBars: public Window {
    public:
    	...
    	virtual void display() const;
    };
    
    void printNameAndDisplay(Window w)
    {
    	cout << w.name() << endl;
    	w.display();
    }
    WindowWithScrollBars wwsb;
    printNameAndDisplay(wwsb);
    
  • 以上规则并不适用于内置类型,以及STL的迭代器和函数对象。对它们而言,pass-by-value往往比较适当。

Item23:宁以non-member、non-friend替换member函数【对封装的解释讲得很好】

  • member函数以及及friend函数可以访问private成员变量。而方法论是:越少人看到成员变量,意味着我们有越大的弹性去改变它,因为我们的改变仅仅影响到改变的那些人事物。这就是我们推崇封装的原因:它使我们能够改变事物而只影响有限客户。
  • 显然,non-member、non-friend会有较大的封装性性,因为它不增加”能够访问class内之private成分“的函数数量。

Item24:若所有参数皆需类型转换,请为此采用non-member函数

class Rational {
public:
	// 构造函数可以不为explicit,允许int-to-Rational隐式转换
	Rational(int numerator = 0, int demoniator = 1);
	// 分子和分母的访问函数
	int numerator() const;
	int demoniator() const;
	// 最前面的const说明只能是右值
	const Rational operator* (const Rational& rhs) const;
private:
	...
}

这个设计使你能够将两个有理数以最轻松自在的方式相乘:

Rational oneEighth(1, 8);
Rational oneHalf(1, 2);
Rational result = oneHalf * oneEighth; // 很好
result = result * oneHalf;  // 很好

// 这里将2隐式转换成Rational&
result =  oneHalf * 2; // 很好
// 由于2不是Rational class,因此它没有operator*成员函数;即只有当参数位于参数列内,这个参数才是饮食类型转换的合格参与者。
result =  2 * oneHalf;  // 错误!

result =  oneHalf.operator*(2);  // 很好
// 同理,由于2不是Rational class,因此它没有operator*成员函数
result = 2.operator*(onehalf);  // 错误!

// 由于2不是Rational class,因此它没有operator*成员函数;即只有当参数位于参数列内,这个参数才是饮食类型转换的合格参与者。

  • 若一定想要支持混合式算术运算,让operator*成为non-member函数,便允许编译器在每一个实参身上执行隐式类型转换:
class Rational {
	...
};
const Rational operator*(const Rational& lhs, const Rational& rhs) {
	return Rational(lhs.numerator() * rhs.numerator(), lhs.demoniator() * rhs.demoniator());
Rational oneFourth(1, 4);
Rational result;
Rational = oneFourth * 2// 没问题
result = 2 * oneFourth;  // 没问题
}

此处的operator*是非member函数,所以它的参数列位于左右两侧,所以编译器在每一个实参身上执行隐式类型转换。

  • 请记住:
    • 如果你需要为某个函数的所有参数(包括被this指针所指的那个隐参)进行类型转换,那么这个函数必须是个non-member。
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-01 16:38:20  更:2021-10-01 16:39:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 17:53:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码