c++复制构造函数,重载赋值操作符,方法get()

C++ copy constructor, overload assignment operator , methos get()

本文关键字:get 方法 重载 复制 构造函数 c++ 赋值操作符      更新时间:2023-10-16

我在大学有一个c++练习。在这门课上,他们要求我创建一个复制构造函数和一个重载赋值操作符=。所以我照做了,而且效果很好。他们说我在方法get()和我的复制构造函数和重载赋值操作符上是错误的。不幸的是,这个练习效果很好。也没有要求main()

#include <iostream>
using namespace std;
class DIcourse{
private:
   int *ids;
   int numstudents;
   char *title;
   char *description;
public:
    DIcourse();
   ~DIcourse();
    DIcourse(const DIcourse &tmp);
    DIcourse operator=(const DIcourse &tmp);
    int const get_num();
    char const *get_title();
    char const *get_description();
    int const *get_ids();
    int set_num_ids(int num);
    char set_description(char *tmp);
    char set_title(char *temp);
};
DIcourse :: DIcourse(){
   ids=NULL;
   numstudents=0;
   title=new char[50];
   description=new char[200];
}
DIcourse :: ~DIcourse(){
   delete [] ids;
   delete [] title;
   delete [] description;
}
DIcourse :: DIcourse(const DIcourse& tmp){
   numstudents=tmp.numstudents;
   ids=new int[numstudents];
   for(int i=0;i<numstudents;i++){
      ids[i]=tmp.ids[i];
   }
   title=tmp.title;
   description=tmp.description;
}
DIcourse DIcourse::operator=(const DIcourse &tmp){
   delete [] ids;
   numstudents=tmp.numstudents;
   ids=new int[numstudents];
   for(int i=0;i<numstudents;i++){
      ids[i]=tmp.ids[i];
   }
   delete[] description;
   delete[] title;
   description= new char[200];
   title= new char[50];
   description=tmp.description;
   title=tmp.title;
   return *this;
 }
const int DIcourse :: get_num(){
  return numstudents;
} 
const char* DIcourse :: get_title(){
   return title;
}
const char* DIcourse :: get_description(){
    return description;
}
const int* DIcourse :: get_ids(){
   return ids;
}
int DIcourse :: set_num_ids(int num){
   numstudents++;
   int *temp_array;
   temp_array=new int[numstudents];
   temp_array[numstudents-1]=num;
   if(ids!=NULL){
     for(int i=0; i<numstudents-1; i++){
       temp_array[i]=ids[i];
    }
   delete [] ids;
   }
   ids=temp_array;
}
 char DIcourse :: set_description(char *tmp){
   int i=0;
   while(tmp[i]!=''){
       description[i]=tmp[i];
       i++;
   }
   description[i]='';
}
char DIcourse :: set_title(char *temp){
   int i=0;
   while(temp[i]!=''){
       title[i]=temp[i];
       i++;
   }
   title[i]='';
} 

你的副本分配应该是:

  DIcourse& operator=(const DIcourse &tmp);
 //^^return reference

同时,应该检查拷贝赋值操作符是否自赋值。

由@Mooing Duck提供:您当前的复制赋值操作符实现中存在内存泄漏:

  DIcourse DIcourse::operator=(const DIcourse &tmp){
          delete [] ids;
          numstudents=tmp.numstudents;
          ids = new int[numstudents];
          for(int i=0;i<numstudents;i++){
              ids[i] = tmp.ids[i];
          }
          delete[] description;
          delete[] title;
          description= new char[200]; //^^
          title= new char[50]; //^^^memory leak here and above
          description=tmp.description; //^^this is not copy char*
          title=tmp.title; //^^this is not copy char* 
          return *this;
     }
 }

你可能想看看复制-交换技巧来实现拷贝赋值操作符。

你的get函数应该是:

int  get_num() const;
              //^^const modifier should be here, 
             //meaning that it access the value but does not change it

const修饰符问题与您的其他getter类似。

除了taocp提到的,您还需要检查您没有分配给自己的赋值操作符。

DIcourse &DIcourse::operator=(const DIcourse &tmp){
if (this != &tmp) {
   ... Do the business here
}
return *this;
}