`

改善c++程序建议——重中之重的类(四)

c++ 
阅读更多
建议55:地方对象切片

1、定义:
c++内存模型规定,如果出现继承结构,内存分布一定是先基类部分的数据,后派生类部分的数据。在派生类向基类映射的过程中,派生类的对象中基类部分的数据会被强行“切”掉。

2、注意:
多态的事先必须依靠指向同一类族的指针或是引用。否则,就可能出现著名的对象切片问题。所以,在既有继承又有虚函数的情况下,一定要地方对象切片。

3、代码示例
#include<iostream>
#include <string>
using namespace std;

class Bird
{
public:
	Bird(const string& name) : m_name(name){}
//	虚函数
	virtual string Feature() const
	{
		return m_name + " can fly.";
	}

protected:
	string m_name;
};

class Parrot : public Bird
{
public:
	Parrot(const string& name, const string& food)
		: Bird(name), m_food(food){}

	virtual string Feature() const
	{
		return (m_name + " can fly and likes to eat " + m_food);
	}

private:
	string m_food;
};

// 默认的
void DescribeBird(Bird bird)
{
	cout << bird.Feature() << endl;
}

// 引用版
/*
void DescribeBird(Bird& bird)
{
	cout << bird.Feature() << endl;
}
*/
//指针版
/*
void DescribeBird(Bird* bird)
{
	cout << bird.Feature() << endl;
}
*/

int main()
{
Bird bird1 ("Crow");
DescribeBird(bird1);
Parrot Bird2("Polly", "millet");
DescribeBird(bird2);  // 出乎意料
return 0;
}


建议56:在正确的场合使用恰当的特性

主要分析c++针对c的高级特性的代价,我们要恰当的使用它们,提高效率;

1)虚函数
虚函数机制的实现是通过虚函数表和指向虚函数表的指针来完成;
他是c++中众多运行时多态特性中开销最小的、最常用的机制,
a、因为在程序中每个类只有一个虚函数表的拷贝,所以它占用的空间不是很大;
b、在时间方面, 虚函数的调用开销包括两次整型加法的开销和一次指针间接引用的开销;

2)多重继承
针对于虚函数来说,对象内部有多个指针;
3)虚基类
虚基类与多重继承的情况一样,因为虚基类是为了多重继承而产生的,对象内部处理插入积累函数的指针外,还插入虚基类指针;

建议57: 将数据成员声明为private
1)用private修饰成员变量,可让数据成员隐藏起来,通过数据成员的Getter和Settr来实现访问控制,这样可以更加精确的控制成员可读性;
2)将数据成员隐藏于功能性的接口中,其实是为我们预留了以后改变实现决策的权利,并为以后的各种实现提供了弹性;
3)保持语法的一致性
坚持这一原则,我们就不必要在访问类成员方式的问题上再纠结而消耗时间;

分享到:
评论

相关推荐

    Visual C++面向对象程序设计-课件.rar

    下面将详细阐述C++面向对象程序设计中的关键知识点,并结合课程标签进行拓展。 1. **C++简介**:C++是C语言的扩展,由Bjarne Stroustrup在1983年开发,它引入了类、模板、异常处理等面向对象特性,使得C++成为一种...

    c++编程思想 中文版(Thinking in C++)

    9. **C++11及以后的新特性**:自C++11标准发布以来,C++引入了许多新特性,如右值引用、lambda表达式、自动类型推断(auto)、统一初始化等,这些都极大地改善了C++的编程体验。 学习《C++编程思想》这本书,不仅...

    effective stl

    世界级C++大师Scott Meyers之Effective三部曲之一,中国C++技术先驱及著名作译者潘爱民先生经典译作——如同Meyers的其他著作一样,本书充满了从实践中总结出来的智慧,其清晰、简明、透彻的风格,必将使每一位STL...

    软件工程思想

    - **第六章:C++面向对象程序设计** —— 专注于C++语言的面向对象特性,提供了实用的编程技巧和模式。 - **第七章:测试与改错** —— 强调了软件测试的重要性,介绍了测试策略、方法和技术,以及如何高效地进行...

    BtnST.zip_btnst

    《BtnST.zip_btnst——提升Visual C++按钮样式之美学与技术实现》 在软件开发过程中,用户界面的美观性和易用性是决定产品成功与否的重要因素之一。Visual C++作为一款强大的Windows应用程序开发工具,提供了丰富的...

    Visual C#2010从入门到精通(中文版).pdf

    尽管开发环境有所改善,并且引入了新的编程语言C#,但每次新版本发布时,程序员们可能会感觉到功能的增加和安装程序体积的增大,并没有带来预期中的革命性变化,这在一定程度上让人感到失望。然而,Visual Studio ...

    Java学习资料

    - 添加Java类程序:在项目中添加新的Java类。 - 编写源程序:使用Eclipse的编辑器编写Java代码。 - 运行程序:直接在Eclipse中启动Java程序。 - Java程序打包:将Java程序打包成可部署的格式,如JAR文件。 ####...

    Linux 操作系统技术合集.pdf

    - **概述**: 使用文本编辑器编写C/C++程序。 - **实践**: 使用`vi`或`vim`编写代码。 **2. vi最基本操作** - **概述**: 学习基本的vi编辑器操作。 - **实践**: 掌握插入模式、命令模式之间的切换等基本操作。 ...

    linux入门教材-清华大学自动化系arm 培训教材

    ### Linux入门教材——嵌入式Linux概要性入门教材 #### 一、嵌入式系统的硬件构成 **1.1 嵌入式系统硬件** ##### 1.1.1 嵌入式处理器 **1.1.1.1 嵌入式微处理器(Embedded Microprocessor Unit, EMPU)** 嵌入式...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

     Oracle 数据库中的SQL是当今市场上功能最强大的SQL实现之一,而本书全面展示了这一工具的威力。如何才能让更多人有效地学习和掌握SQL呢?Karen Morton及其团队在本书中提供了专业的方案:先掌握语言特性,再学习...

    GDI+ SDK参考(翻译版本)

    Microsoft Windows GDI+ 是一个专为 C/C++ 开发者设计的基于类的应用程序编程接口(API)。该 API 的主要目的是使开发者能够更加高效地创建高质量的图形用户界面(GUI),并且支持复杂的图形处理操作。GDI+ 提供了...

Global site tag (gtag.js) - Google Analytics