如何在常量变量的初始化列表中进行深度复制
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”问题已解决。
我知道构造函数中的深拷贝可以通过以下方式完成。
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”问题已解决。