数组初始化
内置数据类型与类类型数组初始化区别
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);
}
}