c++ 深拷贝 函数后加const

        简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!

       

#include <iostream>
#include <cstring>

using namespace std;

class MyString

{

public:

    MyString(const char*);

    MyString(int = 0, char = '\0');  //initialize size_t number of char, terminated with '\0'

    MyString(const MyString&);           //copy constructor

    ~MyString();                                          //destructor

    const char* c_str() const;                   //return private char*

    static int getNumberOfObjects();

private:

    char *str;

    static int numberOfObjects;             //count the number of MyString objects

};

int MyString::numberOfObjects = 0;
//deep step
MyString::MyString(const char *inputstr) {
	str = new char[strlen(inputstr) + 1];
	strcpy(str, inputstr);
	numberOfObjects++;
}

//字符串最后一位要自己加空字符	
MyString::MyString(int size_t, char a) {
	str = new char[size_t + 1];
	int i = 0;
	for(; i < size_t; i++) *(str + i) = a;
	*(str + i) = '\0'; 
	numberOfObjects++;
}

// deep copy step	
MyString::MyString(const MyString& _str) {
	const char* t = _str.c_str();
	str = new char[strlen(t) + 1];
	strcpy(str, t);
	numberOfObjects++; 
}

//delete deep copy 
MyString::~MyString() {
//	str = 0;
	if(str != NULL)
		delete []str;
	numberOfObjects--;
}

const char* MyString::c_str() const{
	return str;
}

int MyString::getNumberOfObjects() {
	return numberOfObjects;
}


这里有个比较小的细节,在const char* c_str()这个函数后面要加const。

根据TA的解释,是因为不加const的话会导致

const char* t = _str.c_str();
这里编译错误,因为传进来的参数声明为const MyString& _str,然后我们直接调用了_str这个对象的成员函数c_str(),它非常担心这个成员函数会改变_str的值(虽然这个函数并不会改变_str的值,可是你不把c_str()这个函数声明为const,它不放心调用啊,万一被改了呢)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值