1. ClassName object(param);
这样就声明了一个ClassName类型的object对象,C++会为它分配足够的存放对象所有成员的存储空间。
注意:为节省存储空间,C++创建对象时仅分配用于保存数据成员的空间,而类中定义的成员函数则被分配到存储空间中的一个公用区域,由该类的所有对象共享。这种方法创建的对象,内存分配是分配到栈中的,由C++缺省创建和撤销,自动调用构造函数和析构函数。
如果程序中没有提供任何构造函数,则编译器会为程序定义一个默认构造函数。否则,必须自己定义构造函数;如果自己声明了构造函数,就要定义此构造函数,并使用该构造函数创建对象。
该方法创建的对象调用类方法时,必须用“.”,而不能用“->”。
2. ClassName *object = new ClassName(param);
delete object;
这种方法跟java有点类似,相同的是,它们都是在堆上分配内存来创建对象的(与上不同);不同的是,C++用new创建对象时返回的是一个对象指针,object指向一个ClassName的对象,C++分配给object的 仅仅是存放指针值的空间。而且,用new 动态创建的对象必须用delete来撤销该对象。只有delete对象才会调用其析构函数。
注意:new创建的对象不是用“*”或“.”来访问该对象的成员函数的,而是用运算符“->”;
一般来说,编译器将内存分为三部分:静态存储区域、栈、堆。静态存储区主要保存全局变量和静态变量,栈存储调用函数相关的变量、地址等,堆存储动态生成的变量。在c中是指由malloc,free运算产生释放的存储空间,在c++中就是指new和delete运算符作用的存储区域。
3. 在构造函数中使用new:
注意问题:
如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete。
new和delete相互兼容,new对应delete,new[]对于delete[]。
若有多个构造函数,则必须以相同的方法使用new,要么都带中括号,要么都不带。
用于定义一个复制构造函数,通过深度复制将一个对象初始化为另一个对象,应该分配足够的空间来存储复制的数据,并复制数据,而不仅仅是数据的地址。
应当定义一个赋值运算符,通过深度复制,将一个对象复制给另一个对象。
String::String(const String & st) { num_strings++; len = st.len; str = new char[len+1]: std::strcpy(str, st.str); } String & String ::operator=(const String & st) { if (this == &st) return *this; delete[] str; len = st.len; str = new char[len + 1]; std::strcpy(str, st.str); return *this; }
原文:https://www.cnblogs.com/zxjcoming/p/12323460.html