C++初始化

数组初始化

内置数据类型与类类型数组初始化区别

1、对于内置数据类型元素的数组,必须使用()来显示指定程序执行初始化操作,否则程序不执行初始化操作

int *pia = new int[10];       // 每个元素都没有初始化
int *pia2 = new int[10] ();  // 每个元素初始化为0

2、类类型元素的数组,无论是否使用(),都会自动调用其默认构造函数来初始化。

string *psa = new string[10];  // 每个元素调用默认构造函数初始化
string *psa = new string[10]();  // 每个元素调用默认构造函数初始化

整数数组初始化实例

//默认初始化
int a[5] = {};    //[0, 0, 0, 0, 0]
//全部初始化为0
int a[5] = {0};    //[0, 0, 0, 0, 0]
//c++11新写法
int a[5]{};    //[0, 0, 0, 0, 0]

//数组初始化列表中的元素个数小于指定的数组长度时, 不足的元素以默认值填补。 
int a[5] = {1};    //[1, 0, 0, 0, 0]
//也可以分别赋值
int a[5] = {1,1,1,1,1}; //[1,1,1,1,1]

字符串数组初始化实例

和整型的初始化基本一致,会调用构造函数

string *str = string[5];    //调用5次默认构造函数
string *str1 = string[5]{"aaa"};    //数组中的第一个元素调用 string::string(const char *)  进行初始化。后面四个调用 默认构造函数

数组的堆初始化实例

int *a = new int[5];        //脏数据数组
int *str = new string[5];    //空字符串数组
int *b = new int[5]{0};    //   [0,0,0,0,0]
int *str1 = new string[5] {"aaa"};    //["aaa","","","",""]
//以上几行代码遵循栈中数组的初始化规则,除此之外这里还有一个新语法
int *c = new int[5]();    //[0,0,0,0,0]
//该语法后面的一对圆括号,表示使用默认值初始化整个数组,所以对于类类型来说,new string[5] 与 new string[5]() 是等价的,都会调用默认构造函数进行初始化;但是对于基本类型就不同了。new int[5]根本不会初始化,而new int[5]()则会使用int()的值,即0进行初始化。

对象初始化

C++中有两种创建对象的方法,一种是直接声明,另一种则是使用new关键字,虽然作用相同,但是它们底层的存储方式却完全不同。
1、C++的第一种类对象的创建方法,直接声明:
如下代码所示:
Demo object1(“object1”)
这种方法创建时,会在栈区开辟内存空间,内存管理由C++自己处理。但是栈区是有限的,而且一般空间不大,所以new就派上用场了!

#include <iostream>
using namespace std;
class Demo{
public:
    Demo(int data)
    {
        val = data;
    }
private:
    int val;
};
int main(){
    Demo object1(89);
}

2、使用new来初始化一个对象。
Demo *object2 = new Demo(“object2”)
存储在堆区,程序员自己管理,new之后需要手动delete,否则内存泄漏

int main(){
    Demo *object2 = new Demo(99);
    delete object2;
}

创建动态对象数组

#include <iostream>
using namespace std;
class Demo{
public:
    Demo(int data)
    {
        val = data;
    }
    Demo()
    {
        val = 0;
    }
private:
    int val;
};
int main(){
    Demo object1[10];
}

如果类没有默认构造方法,上面的方法就会报错,面对没有默认构造方法的类的对象数组的构造方法如下:

#include <iostream>
using namespace std;
class Demo{
public:
    Demo(int data)
    {
        val = data;
    }
    /*Demo()
    {
        val = 0;
    }*/
private:
    int val;
};
int main(){
    //Demo objs[10]; // error;   
    //Demo* object1 = new Demo[10] // error;
    Demo **objs = new Demo *[10];
    for (int i = 0; i < 10; i++)
    {
        objs[i] = new Demo(89);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值