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

果然,光看书是没用的,一编程序,很多问题就出现了--
注意事项:

1、 如果构造函数中适用了new初始化指针成员,则构析函数中必须要用delete
2、 new与delete必须兼容,new对应delete,new[]对应delete[]
3、如果有多个构造函数,则必须以相同的方式使用new,要么都是new,要么都是new[],因为构析函数只能有一个
4、 应该定义一个复制构造函数,通过深度复制,将一个对象初始化为另一个对象
5、 应该定义一个赋值运算符,通过深度复制,将一个对象复制给另一个对象

#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
class String
{
private:
    char *str;
    int len;
    static int num_string;

public:
    String();
    String(const char *s);
    String(const String &s);
    ~String();
    friend ostream& operator<<(ostream &os,String s);
    String operator=(const String &s)
    {
        if(this==&s) return *this;

        len=s.len;
        delete [] str;
        str=new char[len+1];
        strcpy(str,s.str);
        return *this;
    }
};
int String::num_string=0;
String::String()
{
    len=4;
    str=new char[len+1];
    strcpy(str,"C++");
    num_string++;
}
String::String(const char *s)
{
    len=strlen(s);
    str=new char[len+1];
    strcpy(str,s);
    num_string++;
}
String::String(const String &s)
{
    len=s.len;
    num_string++;
    str=new char[len+1];
    strcpy(str,s.str);
}
String::~String()
{
    num_string--;
    delete [] str;
    printf("---  %d\n",num_string);
}
ostream& operator<<(ostream &os,String s)
{
    os<<s.str;
    return os;
}
int main()
{
    String p("wwwww");
    String p1("qqqqqq");
    String p2;
    p2=p1;
    cout<<p<<endl<<p1<<endl<<p2<<endl;
    return 0;
}

  

时间: 2024-10-11 05:52:51

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

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

使用new初始化对象中的指针成员时遇到的问题 在构造函数中使用new初始化指针成员,那么析构函数中就必须使delete,并且new对应delete, new[]则对应于delete[]. 在有多个构造函数的情况下,必须以相同的方式使用new,要不用new,要不用new[],因为只存在一个析构函数,所有的构造函数都必须与虚构函数相兼容. PS. 当然在构造函数中使用new初始化指针的时候,可以把指针初始化为空(0/NULL 或者是C++11中的nullptr),因为delete不管有没带[]都与空

修改NSMutableArray中的元素时的注意事项

最近做项目遇到从文件加载数组,并对数组中的元素进行操作的问题,特意写了个Demo,记录下要注意的东西: 代码如下: NSArray *array = @[@"1", @"2", @"3"]; NSMutableArray *marray = [[NSMutableArray alloc] initWithArray:array]; NSString *temp = [marray objectAtIndex:1]; temp = @"2

DLL中使用字符串时的注意事项。

library dll1; uses SysUtils, Classes; {$R *.res} function TESTDLL:string;stdcall; begin Result:='test.'; end; exports TESTDLL; begin end. 原文地址:https://www.cnblogs.com/blogpro/p/11453436.html

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

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[])

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

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

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

Effective JavaScript Item 38 在子类构造函数中调用父类构造函数

本系列作为Effective JavaScript的读书笔记. 在一个游戏或者图形模拟的应用中,都会有场景(Scene)这一概念.在一个场景中会包含一个对象集合,这些对象被称为角色(Actor).而每个角色根据其类型会有一个图像用来表示,同时场景也需要保存一个底层图形展示对象的引用,被称为上下文(Context): function Scene(context, width, height, images) { this.context = context; this.width = width

Android中自定义样式与View的构造函数中的第三个参数defStyle的意义

零.序 系统自带的View可以在xml中配置属性,对于写的好的Custom View同样可以在xml中配置属性,为了使自定义的View的属性可以在xml中配置,需要以下4个步骤: 通过<declare-styleable>为自定义View添加属性 在xml中为相应的属性声明属性值 在运行时(一般为构造函数)获取属性值 将获取到的属性值应用到View 怎么将获取到的属性值应用到View就不用说了,自己定义的属性什么用处自己肯定是清楚的,所以接下来看一下前三点. 一.自定义Style 通过<