1. 全局变量是如何初始化的

//global var
A a; int main()
{
cout<<a<<endl;
return ;
}

  如上述例子,全局变量a是在main()函数之前便被初始化的,但是它是如何被初始化的呢?答案是所谓的静态初始化

2. C++对C进行封装的布局成本

  C++在布局和存取时间上主要的额外负担是由virtual 机制引起的,包括:

virtual function机制:用于支持有效率的“执行期绑定”

virtual base class:用以实现“多次出现在继承体系中的base class ,有一个单一而被共享的实体”

  此外,还有一些多重继承下的额外负担,发生在“一个derived class 和其第二或后继之 base class 的转换”之间。然而,一般而言,并没有什么天生的理由说C++程序一定比C兄弟庞大或迟缓。

3. 父类与子类的指针有什么不同?

  看下面例子:

class ZooAnimal
{
public:
ZooAnimal(): name("")
{
cout<<"ZooAnimal::ZooAnimal()"<<endl;
} ZooAnimal(string str): name(str)
{
cout<<"ZooAnimal::ZooAnimal(string)"<<endl;
} virtual ~ZooAnimal()
{
cout<<"ZooAnimal::~ZooAnimal()"<<endl;
} virtual void rotate()
{
cout<<"ZooAnimal::rotate()"<<endl;
} protected:
int loc;
string name;
}; class Bear: public ZooAnimal
{
public:
Bear()
{
cout<<"Bear::Bear()"<<endl;
} Bear(string str): ZooAnimal(str)
{
cout<<"Bear::Bear(string)"<<endl;
} ~Bear()
{
cout<<"Bear::~Bear()"<<endl;
} void rotate()
{
cout<<"Bear::rotate()"<<endl;
} virtual void dance()
{
cout<<"Bear::dance()"<<endl;
} protected:
enum Dances{DAN, SLEEP}; Dances dances_known;
int cell_block;
}; int main()
{
cout<<"sizeof(ZooAnimal):"<<sizeof(ZooAnimal)<<endl;
cout<<"sizeof(Bear):"<<sizeof(Bear)<<endl; Bear b("Yogi");
Bear *pb = &b;
ZooAnimal *pbr = &b; return ;
}

  指针pb 和 pbr 有什么不同呢?它们都指向Bear对象b的第一个字节,其间的差别是,pb所涵盖的地址包含了整个Bear 对象,而 pbr 所涵盖的地址只包含Bear 对象中的ZooAnimal 部分!

4. 自定义类什么时候自动生成默认构造函数?

  答案:在编译器需要的时候,什么时候需要呢,有如下四种情况:

  合成出来的构造函数只执行编译器所需的行动。也就是说,即使有需要为自定义类合成一个默认构造函数,那个构造函数也不会将类的数据成员初始化为0。

  因此,类的设计者必须提供一个明显的默认构造函数,将数据成员初始化!

  全局对象的内存保证会在程序激活的时候被清零,本地变量对象配置于程序的堆栈中,Heap 对象配置与自由空间中,都不一定被清零。

  1. 如果一个类 B 没有任何构造函数,但它内含有一个数据成员A a,而 A 有默认构造函数,那么编译器需要为这个类 B 合成一个默认构造函数。

class Foo
{
public:
Foo() {...}
Foo(int) {...}
}; class Bar
{
public:
Foo f;
char *str;
};

  如上例,编译器会自动为类Bar合成一个默认构造函数。被合成的Bar default constructor 内含必要的代码,能够调用 class Foo 的default constructor 来处理数据成员f的初始化,但它并不产生任何代码来初始化Bar::str。被合成的default constructor 看起来可能像这样:

inline Bar::Bar()
{
//C++伪码
f.Foo::Foo();
}

  2. 如果该类继承自一个带有默认构造函数的基类,那么编译器也会自动合成一个默认构造函数;

  3. 带有一个Virtual Function 的类,这时,编译器也会为之合成一个默认构造函数。

  4. 带有一个Virtual Base Class 的类,如下例子所示:

class X
{
public:
int i;
}; class A: public virtual X
{
...
} class B: public virtual X
{
...
} class C: public A, public B
{
...
}

  那么,编译器将会为类C合成一个默认构造函数!

  注意:C++新手一般有两个常见的误解:

  1. 任何class 如果没有定义default constructor,就会被合成一个。

  2. 合成的default constructor 会初始化数据成员。

5. 复制构造函数的相关问题

  类的复制构造函数的一般模式为:

X::X(const X& x)
{
....
}

5.1 什么情形会调用复制构造函数

  有三种情况,分别如下:

  1) 赋值操作,例如:

class X { ...};
X a;
X b = a; //copy constructor

  2) 对函数传递类参数时,例如:

void foo(X x)
{
...
} X a;
foo(a); //copy constructor

  3) 当函数传回一个类对象时,这个时候可能编译器做了优化,因此,可能copy constructor 不被调用。例如:

X foo()
{
X a;
return a;
} X b = foo(); //copy constructor

5.2 当类设计者没有定义类的复制构造函数时如何初始化类数据成员?

  其内部是以所谓的默认逐个成员初始化的方法完成的。也就是把每一个内建的或派生的数据成员的值从某个对象拷贝一份到另一个对象身上。 

5.3 默认构造函数和复制构造函数在必要的时候才由编译器产生出来。

C++对象模型学习笔记的更多相关文章

  1. Delphi 对象模型学习笔记(转)

    摘要     Borland Object Pascal 对象模型(现在已经正是命名为 Delphi 语言)与其他 OOP 语言一样,都提供了一些基础服务: 如对象创建服务.对象释放服务.对象识别服务 ...

  2. VSTO学习笔记(二)Excel对象模型

    原文:VSTO学习笔记(二)Excel对象模型 上一次主要学习了VSTO的发展历史及其历代版本的新特性,概述了VSTO对开发人员的帮助和效率提升.从这次开始,将从VSTO 4.0开始,逐一探讨VSTO ...

  3. maven权威指南学习笔记(三)——一个简单的maven项目

    目标: 对构建生命周期 (build  lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project O ...

  4. jQuery学习笔记(一):入门

      jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操 ...

  5. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  6. [原创]java WEB学习笔记54:Struts2学习之路---概述,环境的搭建

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. DirectX 总结和DirectX 9.0 学习笔记

    转自:http://www.cnblogs.com/graphics/archive/2009/11/25/1583682.html DirectX 总结 DDS DirectXDraw Surfac ...

  8. VSTO学习笔记(十五)Office 2013 初体验

    原文:VSTO学习笔记(十五)Office 2013 初体验 Office 2013 近期发布了首个面向消费者的预览版本,我也于第一时间进行了更新试用.从此开始VSTO系列全面转向Office 201 ...

  9. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

随机推荐

  1. PAT - 基础 - 最大公约数和最小公倍数

    题目: 本题要求两个给定正整数的最大公约数和最小公倍数. 输入格式: 输入在一行中给出2个正整数M和N(<=1000). 输出格式: 在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1 ...

  2. 简单实现tab标签页切换

    常见面试题: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  3. 缓存淘汰算法---LRU

    1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. ...

  4. Notepad++插件之FingerText

    FingerText是一个标签触发片段插件记事本.支持多个热点同时编辑,嵌套的热点,动态热点(很多不仅仅是纯文本的,可以通过命令,或触发另一个片段中的片段),热点的文本提示(而不是仅仅是$或#号)和热 ...

  5. HTML部分标签的含义

    标签的用途:我们学习网页制作时,常常会听到一个词,语义化.那么什么叫做语义化呢,说的通俗点就是:明白每个标签的用途(在什么情况下使用此标签合理)比如,网页上的文章的标题就可以用标题标签,网页上的各个栏 ...

  6. 用链表解决if语句过多的问题(C/C++实现)

    起因 http://www.cnblogs.com/code-style/p/3499408.html 设计模式的解决方案(基于python语言) http://www.cnblogs.com/cod ...

  7. Unity3D 3D横版跑酷 跳跃

    Unity3d 跑酷动画的控制 首先给个图吧, 我们跑酷里面需要动画的,今天说一下动画的知识! 1.导入骨骼动画模型文件之后,如果使用之前版本的unity的播放动画的方式,需要设置AnimationT ...

  8. 禁用页面及页面所有frame内的右键菜单

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML> <HEAD& ...

  9. ZOJ-2587-Unique Attack(最小割的唯一性)

    题意: 求无向图最小割是否唯一 分析: 1.我们先对原图求一次最大流 2.对残留网络,我们从S开始,找到所有所有S能到达的点:再从T开始,找出所有能到达T的点. 3.判断原网络中是否还有没有访问到的点 ...

  10. 火狐浏览器对border-radius的渲染问题