default construction

  1. 4种情况下编译器会构造出nontrivial(有用)的构造函数

    1. 带有default construction的member class object

      我们有两个class:

      class Foo { public: Foo(), Foo(int) … };

      class Bar { public: Foo foo; char *str;};

      1. 则编译器会在Bar中合成一个默认的构造函数(看起来像这样):

        Bar() { foo.Foo::Foo(); }

      2. 当我们自己定义了Bar一个或以上的构造函数时,编译器会为我们扩张

        每一个构造函数。比如我们自己定义:

        Bar() { str = 0;}

        则编译器就为我们扩张成:

        Bar() { foo.Foo::Foo(); str = 0; }

      3. 当有多个需要初始化的成员时,编译器会按照成员的声明次序来初始化成员
    2. 带有default construction的base class
    3. 声明或继承一个virtual function的class
      1. 一个virtual function table 会被编译器产生出来,内放class的virtual function 地址。
      2. 在每个class object中,一个额外的pointer member(vptr)会被编译器合成出来,内含

        相关的class vtbl的地址。

    4. 带有一个virtual base class的class

      对于virtual base class中的成员变量,derived class通过存放一个指针,指针中存放

      着对应的基类,用这样的方式来访问virtual base class中的成员变量。

      所以为了初始化这些指针,编译器会默认构造出或扩张nontrivial构造函数做这些初

      始化的工作。

  2. c++新手常见的两个误解
    1. 任何class如果没有定义default constructor,就会被合成出来。
    2. 编译器合成出来的default constructor会明确设定class内每个

      datamember的默认值。

      这两个没有一个是真的

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 21:53:37

default construction的相关文章

游戏架构其七:音效管理

大型游戏中的音效相对比较复杂,如声音的淡入淡出,爆炸音效,声音的播放进度等.下面就看看一个音效管理系统都有些什么吧-- 1. 音效的基本操作: #pragma once //======================================================================== // Audio.cpp : Defines a simple sound system. 参照: // <a target=_blank href="http://blog

C++ Core Guidelines

C++ Core Guidelines September 9, 2015 Editors: Bjarne Stroustrup Herb Sutter This document is a very early draft. It is inkorrekt, incompleat, and pµøoorly formatted. Had it been an open source (code) project, this would have been release 0.6. Copy

Java - this的使用方法

this在内部获得当前对象的引用时调用: (1) return返回当前对象; (2) 构造器调用还有一个构造器, 带參数; (3) 參数的名称和数据成员的名称同样; 注意: this构造器在方法中仅仅能调用一次; 非构造器不能调用带參数的this. //:Flower.java /** * 构造器 * * Created by C.L.Wang on 15/7/12. */ public class Flower { int petalCount = 0; String s = "initial

stl容器之--自定义结构体作为stl容器元素成员的使用

自定义结构体作为stl容器元素成员的设计要求之一是:在对待自定义类型时和内置类型必须是一致的,甚至自定义类型的支持更好. <C++标准程序库>: set和multiset set和multiset会根据特定的排序准则,自动将元素排序.两者不同在于multiset允许重复而set不允许. 只要是assignable.copyable.comparable(根据某个排序准则)的型别T,都可以成为set或multiset的元素型别.没有传入特别排序准则,就采用缺省准则less(这是一个仿函数,以op

Effective C++ 条款总结

自己在看这本书的时候,回去翻看目录的时候,有些规则会被遗忘,因此做个简单的小总结供自己和其他人参考,没读过的还是要先去读一遍的 一.让自己习惯C++ 1.视C++为一个语言联邦 C++是一种包含许多特性的语言,因而不要把它视为一个单一语言.理解C++至少需要学习一下4个部分: ①C语言.C++仍以C为基础 ②objected-oriented C++.面向对象编程,类.封装.继承.多态 ③template C++.C++泛型编程.模板元编程的基础 ④STL.容器.迭代器.算法 2.尽量使用con

组合类的构造函数的调用顺序

文章来源:https://bbs.csdn.net/topics/390253882 “构造函数调用顺序:先调用内嵌对象的构造函数(按内嵌时的声明顺序,先声明者先构造).然后调用本类的构造函数.(析构函数的调用顺序相反)” #include<iostream> using namespace std; class Part //部件类 { public: Part() {cout<<"Part default construction called"<&l

Havok Physics 2012(2)

目录 Havok Physics 2012 Chapter 2. Creating a Simulation 创建一个模拟世界 1. Creating Physics 2012 Objects Havok Physics 2012 Chapter 2. Creating a Simulation 创建一个模拟世界 ? 这一章将带您通过整个过程得到一个模拟世界的启动和运行.具体来说,我们将探索如何创建物理对象和约束,然后如何用这些对象填充仿真世界,最后如何更新仿真世界. 1. Creating P

Spring源码学习(五)bean的加载

加油加油 ?? bean加载的大致过程 1 /** 2 * Return an instance, which may be shared or independent, of the specified bean. 3 * 4 * @param name the name of the bean to retrieve 5 * @param requiredType the required type of the bean to retrieve 6 * @param args argume

Spring中bean的实例化过程

1.从缓存中.优先从一级缓存中拿,有则返回. 如果没有,则从二级缓存中获取,有则返回. 如果二级缓存中拿不到,则从三级缓存中拿,能拿到,则从三级缓存中删除,移到二级缓存. 如果三级缓存也没有,则返回null. 2. 如果是单例模式, 则走createBean 的流程,进行bean对象的实例化. 2.1 获取到该beanDefinition对应的字节码对象. 2.2 prepareMethodOverrides. 检查beanDefinition对象的每一个methodOverride的对象.如果