构造函数中使用new时注意事项

使用new初始化对象中的指针成员时遇到的问题



在构造函数中使用new初始化指针成员,那么析构函数中就必须使delete,并且new对应delete, new[]则对应于delete[]。

在有多个构造函数的情况下,必须以相同的方式使用new,要不用new,要不用new[],因为只存在一个析构函数,所有的构造函数都必须与虚构函数相兼容。

PS. 当然在构造函数中使用new初始化指针的时候,可以把指针初始化为空(0/NULL 或者是C++11中的nullptr),因为delete不管有没带[]都与空指针兼容。

需要自行定义一个复制构造函数和赋值构造函数,用深复制的方式把一个对象初始化给另一个对象,一个对象复制给另一个对象,如下:

复制构造函数:

  1. 分配足够空间存储复制的数据
  2. 复制数据,不仅仅地址
  3. 更新受到影响的静态类成员
1 String:String(const String & st)
2 {
3     num_Strings++;
4     len = st.len;
5     str = new char[len+1];
6     std::strcpy(str,st.str);
7 }

赋值构造函数:

  1. 检查自我复制情况
  2. 释放成员指针之前指向内存
  3. 复制数据不仅仅地址
  4. 返回一个指向调用对象的引用
String & String:operator=(const String & st)
{
    if(this == &st)
        return *this;
    else
        delete [] str;
        len = st.len;
        str = new char[len+1];
        std::strcpy(str,st.str);
    return *this;
}
时间: 2024-10-06 21:31:57

构造函数中使用new时注意事项的相关文章

在构造函数中使用new时的注意事项

果然,光看书是没用的,一编程序,很多问题就出现了-- 注意事项: 1. 如果构造函数中适用了new初始化指针成员,则构析函数中必须要用delete 2. new与delete必须兼容,new对应delete,new[]对应delete[] 3.如果有多个构造函数,则必须以相同的方式使用new,要么都是new,要么都是new[],因为构析函数只能有一个 4. 应该定义一个复制构造函数,通过深度复制,将一个对象初始化为另一个对象 5. 应该定义一个赋值运算符,通过深度复制,将一个对象复制给另一个对象

SQL Server中GETDATE转换时间时注意事项

在SQL Server中,有时候查询数据时,需要限定查询时间范围.此时需要对时间进行运算, 如下所示: USE AdventureWorks2014; GO SELECT  * FROM    HumanResources.Employee WHERE   ModifiedDate > GETDATE() - 20; 例如,获取前一天的时间,可以用下面这样的SQL语句. SELECT GETDATE() -1, GETDATE(); 至于为什么写这样的SQL,一来这样书写非常简单方便,比用DAT

[转载]虚函数在构造函数中,已经失去了虚函数的动态绑定特性

class A { public: A() { Print(); } virtual void Print() { printf("A is constructed.\n"); } }; class B: public A { public: B() { Print(); } virtual void Print() { printf("B is constructed.\n"); } }; int _tmain(int argc, _TCHAR* argv[])

编写makefile时注意事项

CFLAGS=-Wall -g  这个-Wall开头字母一定要大写.这种小错误会导致不能编译! 其次就是在一个目录下面的应该是文件 ,而不能在继续用文件去进行编写代码,因为make寻找当前目录下的makefile,makefile里面用到的文件而不是目录里的代码,如果需要也要通过-l(l链接link)一下.所以再一个目录下,编写文件尽量用vi命令,而不是mkdir.这两个区别要搞清楚.文件与目录还是有区别的. linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具

Windows 窗体设计器中的设计时错误

在用 VS.NET进行窗体设计的时候,经常会遇到这样的问题:我们需要在构造函数或者在OnLoad事件中进行自己的一些初始化操作,比如连接一个数据库.调用一个资源文件或者后期绑定一个组件.如果代码通过编译,在运行时会执行得相当如你所愿.然而,当我们用窗体设计器打开这样一个窗体或者继承的窗体,IDE环境会抛出非常令人不愉快的异常,比如(NullReferenceException ). 究其原因,主要是窗体设计器在载入窗体时会自动初始化该对象,自动执行诸如构造函数.OnLoad方法和Initiali

解决在构造函数中使用Session,Session为null的问题

问题描述: public abstract class PageBase : System.Web.UI.Page 在PageBase中如何使用Session??? 我直接用 Session["Name"] 提示:只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态.还请确保在应用程序配置的 <configuration>\<system.web>\<httpModules> 节中包括 S

在Pages中使用MathType的注意事项

虽然MathType这款数学公式编辑器软件能够与Pages等办公软件能够像与Office一样完美兼容,但在操作上仍然有些不同,尤其是在Pages中编辑MathType公式时还是有很多需要我们去注意一些操作事项. 若有疑问可直接访问:http://www.mathtype.cn/mac/bianji-zhuyi.html 将IOS Keynote中的公式后粘贴到Pages中后调节公式的位置       如果你从IOS的Keynote中将粘贴公式到Pages中,一旦你在苹果操作系统的Pages中打开

避免在构造函数中调用虚方法(Do not call overridable methods in constructors)

CLR中说道,不要在构造函数中调用虚方法,原因是假如被实例化的类型重写了虚方法,就会执行派生类型对虚方法的实现.但在这个时候,尚未完成对继承层次结构中所有字段的初始化.所以,调用虚方法会导致不可预测的行为.归根结底,这是由于调虚方法时,直到运行时之前,都不会选择执行该方法的实际类型. 在MSDN中,也给我我们详细的提示和范例. https://msdn.microsoft.com/en-us/library/ms182331.aspx 那我们就亲手来测试一下,新建两个类,Perople类,Chi

【编程开发】C语言中随机数rand使用注意事项

[编程开发]C语言中随机数rand使用注意事项 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:随机数在编程开发中非常重要,以C语言中的rand函数为例,使用时需要注意随机数的随机体现在哪里,比如是程序在不同的时刻执行时,相同位置的随机数是否需要一样,还是要每次执行生成的随机数也要不一样,等等,这些都是需要加以关注的地方. 经测试,发现,在不使用srand这个随机数种子的情况下:每次运行生成的随机数都是一样的.有的时候是需要这样子的,当然可以直接使