学习笔记

C++PrimerPlus类和动态内存分配
Publish: 2018/7/23   

动态内存和类

C++自动提供了下面这些成员函数:

复制构造函数

复制构造函数用于将一个对象赋值到新创建的对象中,复制构造函数原型:
Class_name(const Class_name &);

何时调用复制构造函数?
新建一个对象并将其初始化为同类现有对象时,复制构造函数都将被调用。具体的说,当函数按值传递对象或函数返回对象时,都将使用复制构造函数,按引用传递对象可以节省调用构造函数的时间以及存储新对象的空间。

//4种声明都将调用复制构造函数
StringBad ditto(motto);
StringBad metoo=motto;
StringBad alse=StringBad(motto);
StringBad * pStringBad=new StringBad(motto);

默认的复制构造函数功能:逐个复制非静态成员(成员复制也称为浅复制),复制的是成员的值。

复制构造函数造成的问题?

  1. 无法准确的记录创建对象计数
    StringBad::StringBad(const StringBad &st){num_strings++;...} //提供一个对计数进行更新的显示复制构造函数
  2. 如果成员变量是动态创建的,在调用析构函数时将引发问题
    str=new char[len+1];std::strcpy(str,st.str);//进行深度复制

深度复制:复制指向的数据而不是指针。

何时使用复制构造函数?
如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而不是指针

复制运算符

复制运算符会出现与隐式复制构造函数相同的问题:数据受损
如何解决:
提供赋值运算符(进行深度复制)定义

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

className(cosnt className &)//通用格式

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;
}

C++11提供了关键字nullptr来表示空指针

默认构造函数标准写法
String::String()
{
    str="default string";
    len=str::strlen(str);
}
//可改为下面任何一种形式
String::String()
{
    len=0;
    str=new char[1];
    str=[0]='\0';
}

String::String()
{
    len=0;
    str=0; // str=nullptr;
}

String::String()
{
    static const char * s="C++";
    len=std::strlen(s);
    str=new char[len+1];
    std::strcpy(str,s);
}

有关返回对象说明

返回指向const对象的引用

返回引用不会调用复制构造函数,效率更高

返回指向非const对象的引用
使用指针对象,需要注意几点
成员初始化列表的语法
//mem1,mem2,mem3是Classy类的数据成员
Classy::Classsy(int n,int m) :mem1(n),mem2(0),mem3(n*m+2){ ... }

初始化工作是在对象创建时完成的,请注意以下几点:

C++11的类内初始化

//与上面等价
Class Classy
{
    int mem1=10;
    const int mem2=20;
}


← C++PrimerPlus类继承 C++PrimerPlus类的使用 →

Powered by Hexo, Theme designs by @hpcslag.
Style-Framework Tocas-UI designs by @yamioldmel