变量初始化

原创 2004年10月08日 17:50:00

变量初始化有三种方式:
         方式                                    example
-------------------------------------------------
1.调用default ctor                        T t;
2.调用对应参数类型的ctor       T t(parameter);
3.调用copy ctor                           T t = u;

值得注意的是在3时,虽然从表面上看有个=号,但不能以为就会用到assignment operator,不要被表面现象蒙蔽,这只是从c语法中沿用下来的。
另外,当u是T类型的对象时,T t = u; 相当于 T t(u);  ; 
但若u为其它类型对象时,它就相当于 T t(T(u)),先将u转化为一个临时的T对象,然后再调用copy ctor构造对象。有些编译器会优化掉这个临时对象,方法就是直接调用u的类型构造函数。vc7和bcc32都会进行这项优化处理。
[疑惑]但Exceptional C++说:如果这样优化,拷贝构造函数也是必须的。但我实验发现:没有必要有copy ctor,why?
所以,最好用2来代替3,而且2还有一个优势就时接受多个参数,3只能接受1个参数。

[experiment]
#include <iostream>
using namespace std;

class T {
public:
 T()
 {
  id_ = ++count_;
  cout << "T #" << id_ << " default ctor, ";
  printCount();
 }
 T(int)
 {
  id_ = ++count_;
  cout << "T #" << id_ << " T(int), ";
  printCount();
 }
 T(const T& other)
 {
  id_ = ++count_;
  cout << "T #" << id_ << " copy ctor from #" << other.id_ << ", ";
  printCount();
 }
 ~T()
 {  
  --count_;
  cout << "T #" << id_ << " destroyed, ";
  printCount();
 }
 T& operator=(const T& rhs)
 {
  cout << "T #" << id_ << " assignment op from #" << rhs.id_ << endl;
  return *this;
 }

private:
 void printCount() { cout << count_ << " instances exist" << endl; }
 static int count_;
 int id_;
};

int T::count_ = 0;

int main()
{
 cout << "[1]------------------------/n";
 T t1;  // call default ctor
 //T red_herring1();  // function declaration

 cout << "[2]------------------------/n";
 T t2(1); // call direct ctor
 T t3(t1); // call copy ctor
 //T red_herring2(T); // function declaration

 cout << "[3]------------------------/n";
 T t4 = 1; // call direct ctor
 T t5 = t1; // call copy ctor

 cout << "------- game over! --------/n";
}

[output]
[1]------------------------
T #1 default ctor, 1 instances exi
[2]------------------------
T #2 T(int), 2 instances exist
T #3 copy ctor from #1, 3 instance
[3]------------------------
T #4 T(int), 4 instances exist
------- game over! --------
T #4 destroyed, 3 instances exist
T #3 destroyed, 2 instances exist
T #2 destroyed, 1 instances exist
T #1 destroyed, 0 instances exist

[分析]
对象t4被编译器优化,直接调用了T::T(int),而不是先调用T::T(int)转化为temp,再用copy ctor构造

[Reference]
Exceptional C++  Item 42 Variable Initialization-Or is it?

C++11中变量初始化方法汇总

1 背景     参考资料[1]提到,在C++语言中,初始化与赋值并不是同一个概念,它是一个异常复杂的问题。因此有必要专门对这个问题进行总结。 2 参考资料 [1]C++ Primer中文版(第5版)...
  • Q1302182594
  • Q1302182594
  • 2015年08月11日 17:14
  • 4739

变量初始化技巧

变量初始化时如果不是初始化为0的话就对它显示初始化,否则不初始化
  • sonbai
  • sonbai
  • 2012年12月15日 16:52
  • 661

c++中静态成员变量要在类外部再定义或初始化的原因

,否则产生link2001错误. class testClass {   public:   static int m_i; }; // 类外部定义,若不写会产生 // error LNK2001...
  • icandoit2010
  • icandoit2010
  • 2016年12月09日 17:20
  • 4406

C与C++变量的初始化

C语言的默认初始化值: 1)全局变量存放在全局数据区,由编译器建立,如果在定义的时候不做初始化,系统会将其自动初始化,数值型为0,字符型和指针变量会自动赋值为NULL。静态变量和全局变量类似。而非静态...
  • qq_33774935
  • qq_33774935
  • 2016年09月02日 11:10
  • 311

static变量初始化

1.在C++中,全局static变量和class的static成员变量在main函数之前初始化,main函数之后销毁 2. 函数内部的局部static变量在该函数第一次被调用时初始化,在main函数...
  • sunmenggmail
  • sunmenggmail
  • 2012年06月01日 20:30
  • 3752

Ruby 中变量的初始化

Ruby中的变量分为四类,分别是:类变量、实例变量、全局变量和局部变量 类变量      在使用类变量之前必须对其进行初始化赋值。否则引用一个未初始化的类变量会得到一个错误。      class K...
  • king6603
  • king6603
  • 2010年06月09日 00:13
  • 2084

从汇编看待变量初始化

通过查看vc、gcc编译器的反汇编代码 char *str="helloworld" char str[]="helloworld" char str[11]="helloworld" char st...
  • lonelyrains
  • lonelyrains
  • 2013年07月14日 16:36
  • 2070

C语言编程规范之我见——变量初始化

C语言编程规范中,一个争论已久的问题,就是变量是否该在定义时进行初始化。 针对这个问题,谈谈我的个人想法。 相比于变量定义时初始化,本人更倾向于变量按需初始化。 当然,变量按需初始化并不是不要在定义时...
  • hantingmao
  • hantingmao
  • 2017年03月14日 15:00
  • 262

Java 变量到底要如何初始化

本问题讨论变量的初始化,所以先来看一下Java中有哪些种类的变量。 类的属性,或者叫值域方法里的局部变量方法的参数 对于第一种变量,Java虚拟机会自动进行初始化。如果给出了初始值,则初始...
  • softn
  • softn
  • 2016年05月31日 06:32
  • 576

javaScript变量的声明及初始化

1.对代码进行折行 doucument.write("hello\ nihao") 这样是被允许的,但是下面就是不被允许的: doucument.writeo\ ("hellonihao...
  • baidu_27893705
  • baidu_27893705
  • 2016年08月28日 13:34
  • 1794
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:变量初始化
举报原因:
原因补充:

(最多只允许输入30个字)