如何在常量变量的初始化列表中进行深度复制

How to deep copy in initialization List incase of const variable

我知道构造函数中的深拷贝可以通过以下方式完成。

class student{
    public:
    int age;
    int rollno;
    char *name; 
    
    
     student(int rollno,int age, char *name){
        this->age=age;
        this->rollno=rollno;


        //deep copy 
        this->name=new char[strlen(name)+1];
        strcpy(this->name,name);
    }
 };

但我想使用初始化列表来完成(如果变量是 const 类型)这是我的新 class:

    class student{
       public:
        const int age;
        int rollno;
        const char *name; // used pointer to avoid wastage of space or less space getting assigned 
      
        student(int age,int rollno, char *name): rollno(rollno),age(age),name(name){
            
        }
    };

现在我正在按以下方式访问这个class

#include<bits/stdc++.h>
#include "student.cpp"
using namespace std;

int main(){

 
    char name[]= "jerry";
    student s(12,1,name);
    cout<<s.name<<endl; //gives jerry
    name[0]='m';
    cout<<s.name<<endl; // gives merry
}

所以我想要的是对象变量的值不应该改变。这意味着它应该在两个 cout 语句中打印 jerry。有类似的问题,但我没有得到这个问题或如何在这种特殊情况下实施。

为什么不使用字符串?我认为这会解决这个问题。

您应该使用 std::string 来存储字符串。

有了它,你的 class 看起来像这样:

class student{
   public:
   const int age;
   int rollno;
   const std::string name; 
  
   student(int age, int rollno, std::string name): 
     rollno(rollno), age(age), name(std::move(name)) {}
};

这不仅能满足您的需求,而且最重要的是:

  • 通过使用 RAII,它还修复了原始代码中存在的内存泄漏问题
  • 由于在 std::string 中进行了一些花哨的优化,这将使您的代码更快,并且在处理小字符串时使用更少的内存,因此即使是您的“避免浪费 space”问题已解决。