补充:构造函数的调用
对象:可以调用成员函数,不可以调用构造函数
我们无法像调用成员函数那样使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的,因此构造函数被用来创建对象,而不能通过对象来调用。
详见:构造函数的4种使用方式总结
- 隐式调用构造函数:
Date d(1999,3,26);
- 显示调用构造函数:
Date d = Date(1999,3,26);
- 使用new运算符:
Date* d = new Date(1999,3,26);
- 使用列表初始化(C++11):
Date* d = new Date{1999,3,26};
- tip:指针不会调用构造函数和析构函数,因此使用new在内存开辟空间调用构造函数(需要自己释放)
Car *p1=new ConcreateDecorator01(new Bmw());
p1=new ConcreateDecorator01(p1);
p1->show();
一、new创建对象避免全局变量
错误调用:st只是局部变量,出了函数st就被销毁了,这样不利于传递参数等,那就得用全局变量了,而new就避免使用全局变量:
void func()
{
Student st;
st.name="hello";
}
void main()
{
func();
cout<<st.name;//错误的调用
}
改正后:Student *st=new Student
,利用new避免全局变量
c++里若想创建对象
ClassName objec;//(初始化参数)
- Stack栈里面分配空间,自动释放。
ClassName object=new ClassNam();
void func()
{
Student *st=new Student;
st->name="hello";
}
void main()
{
func();
cout<<st->name;//正确的调用
}
二、什么时候使用new
当不确定需要多大的时候用new
类里面用new实现多态, 有的时候解决类
接口也用new, 这个一下说不清楚
用new有一定内存泄露的风险, 可以考虑用
ps:浅拷贝的解决
·
new创建在运行阶段 需要创建时就创建,不需要创建时还可以在运行时选择数组长度,
这就是int i; cin>>i; int a[i];
不成功的原因,因为a[i]要在编译阶段就分配好内存,但是i在运行时才能知道
int i; cin>>i; int * a=new int[i];
这样可以,因为都是在运行阶段才进行。