C/C++ 初始化几种方式

来源:互联网 发布:mac怎么安装office软件 编辑:程序博客网 时间:2024/06/04 20:11

一 默认初始化


int *pi = new int; //默认初始化,不对 基本内置类型进行初始化所以pi指向一个未初始化的int

string *ps=new string; //默认初始化为空string


默认初始化规则:

1 内置类型,如果未被显示初始化,由值由定义位置决定。 

1)定义在任何函数之外的变量被初始化为0 

2) 定义在函数内部的内置类型变量不会被初始化

2 类类型,各自决定其初始化对象的方式

函数外部(全局变量),函数内部,都会调用类的构造函数进行初始化


二 直接初始化方式(可以使用传统的花括号(),或c++11引入的{},即使用列表初始化

string s("123") //直接初始化

string s = "123"//拷贝初始化。 编译器把等号右侧的初始值拷贝到新创建对象中。


string s8= string('c',8) //拷贝初始化

等价于

string temp = string('c',8)

string s8 = temp

等价于

string s8('c',8) //直接初始化


三 值初始化(只需在类型名后面跟一对空括号() 即可)

string *ps= new string(); //值初始化为空串

string *ps2 = new string;//直接初始化为空串

int *pi1 = new int();//值初始化为0

int *pi2= new int; //值初始化为 ‘未定义'

1 内置类型 初始化为0

2 类类型,调用构造函数


一段代码 g++/vs 2010对比运行结果

#include <iostream>
#include <vector>


using namespace std;


int main()
{
        int i;
        int *pi = new int;


        int *pi2 = new int();
        int *pi3 = new int(1);




        cout<<" *pi:"<<*pi<<"i:"<<i<<"*pi2:"<<*pi2<<"*pi3:"<<*pi3<<endl;


}


g++编译器:

root@ubuntu:~/c11# ./a.out      *pi:0i:-1074971288*pi2:0*pi3:1

vs2010编译器:

可以检查出 i未初始化局部变量,编译报警告,运行时也遇到错误。 修改i=3之后,*pi依然是未定义的值


0 0