c++ 类成员的初始化顺序

 1 class TestClass1
 2 {
 3 public:
 4     TestClass1()
 5     {
 6         cout << "TestClass1()" << endl;
 7     }
 8     TestClass1(const TestClass1&)
 9     {
10         cout << "TestClass1(const TestClass1&)" << endl;
11     }
12     TestClass1(int i)
13     {
14         cout << "TestClass1(int i) " << i << " " <<endl;
15     }
16 };
17
18 class TestClass2
19 {
20 public:
21     TestClass2() { cout << "TestClass2()" << endl; }
22     TestClass2(const TestClass2&){ cout << "TestClass2(const TestClass2&)" << endl; }
23     int fun() { return 2; }
24 };
25
26 class TestClass3
27 {
28 public:
29     TestClass3(TestClass2& tc2):m_tc2(tc2),m_tc1(m_tc2.fun()) {};
30 private:
31     TestClass1 m_tc1;
32     TestClass2 m_tc2;
33 };
34
35 int main()
36 {
37     TestClass2 tc2;
38     cout << "................................................\n";
39     TestClass3 tc3(tc2);
40     return 0;
41 }

结果:

明明TestClass1的初始化依赖TestClass2,为何TestClass1先于TestClass2初始化。

原文地址:https://www.cnblogs.com/XiaoXiaoShuai-/p/11625390.html

时间: 2024-11-09 03:40:02

c++ 类成员的初始化顺序的相关文章

Java 类成员的初始化顺序

Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究. ? 1 ?无继承情况下的Java初始化顺序: class Sample { Sample(String s) { System.out.println(s); } Sample() { System.out.println("Sample默认构造函数被调用"); } } class Test { static Samp

浅谈java类中成员的初始化顺序(一)

类被创建之后的成员的初始化顺序到底是怎么样的? 首先 不考虑继承 package com; public class DemoOne { /** * 关于类的初始化顺序 */ //不考虑继承结构的情况 private static int a=1; private String str="我被赋值了"; static{ //为什么static成员函数不能访问非static变量, 不能调用非static成员函数? //静态代码块独立于对象而存在 不依赖于对象存在 简单来说可以直接以类型名

类成员变量初始化

C++类对象的构造顺序是这样的:分配内存->调用构造函数时,隐式/显式的初始化各数据成员->在构造函数内部初始化数据成员. C++类初始化需注意以下几点 1.类里面的任何成员变量在定义时是不能初始化的.    2.一般的数据成员可以在构造函数中初始化.(构造初始化列表初始化和构造函数体内赋值初始化)    3.const数据成员必须在构造函数的初始化列表中初始化.(道理很简单,const成员第一次数据初始化就是发生在类构造数据初始化时,一旦过了此时就会出现问题).    4.static在类的

C++ 类对象的初始化顺序 ZZ

C++构造函数调用顺序 1.     创建派生类的对象,基类的构造函数优先被调用(也优先于派生类里的成员类): 2.    如果类里面有成员类,成员类的构造函数优先被调用:(也优先于该类本身的构造函数) 3.     基类构造函数如果有多个基类,则构造函数的调用顺序是某类在类派生表中出现的顺序而不是它们在成员初始化表中的顺序: 4.     成员类对象构造函数如果有多个成员类对象,则构造函数的调用顺序是对象在类中被声明的顺序而不是它们出现在成员初始化表中的顺序: 5.     派生类构造函数,作

类成员变量初始化的问题

class window{ window(int maker){ System.out.println("window"+maker); } } class House{ window w1 ;//new window(1); window w3 = new window(3); House(){ System.out.print("House"); w3 = new window(33); } window w4 = new window(4); } class

java类及实例初始化顺序

1.静态变量.静态代码块初始化顺序级别一致,谁在前,就先初始化谁.从上而下初始化(只在类加载时,初始化一次) 2.非静态变量.非静态代码块初始化顺序级别一致,谁在前,就先初始化谁.从上而下初始化(只要对象实例化一次,就初始化一次) 3.构造方法在非静态变量.非静态代码块之后执行. 4.子类非静态变量.非静态代码块在父类构造方法之后执行. 5.子类构造方法在父类构造方法之后执行. 6.静态方法不会被子类重写. 原文地址:https://www.cnblogs.com/yuefeng123/p/12

C++构造函数对类成员变量初始化,使用初始化列表和构造函数内部直接赋值 的差别

初始化和赋值对内置类型的成员没有什么大的差别,像任一个构造函数都能够. 但有的时候必须用带有初始化列表的构造函数: (1) 成员类型是没有默认构造函数的类.若没有提供显式初始化时,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败. (2) const成员或引用类型的成员.由于const对象或引用类型仅仅能初始化,不能对他们赋值. 另一个赋值次数,效率上的差别: 初始化參数列表在对象初始化时对成员变量赋值一次. 构造函数内直接赋值,对成员变量赋值两

c++11中新型for循环,auto, 类成员的初始化及左右值引用

#include <typeinfo> #include <iostream> #include <string> #include <vector> #include <iterator> static void autoValue(); static void autoPointer(); static void newVersionFor(); static void newVersionConstruct(); static void d

类的成员变量初始化总结

1. C++变量的初始化方式 首先把需要初始化的成员变量分为几类: ?  一般变量(int) ?  静态成员变量(static int) ?  常量(const int ) ?  静态常量(static const int) 对应的初始化方式是: ?  一般变量可以在初始化列表里或者构造函数里初始化,不能直接初始化或者类外初始化 ?  静态成员变量必须在类外初始化 ?  常量必须在初始化列表里初始化 ?  静态常量必须只能在定义的时候初始化(定义时直接初始化) 举一个简单的例子: [cpp] v