类会默认产生的成员函数

来源:互联网 发布:c语言绚丽表白代码 编辑:程序博客网 时间:2024/05/01 14:43

说明:代码来自<<程序员面试宝典>>

#include<iostream>using namespace std;class String{public:       String(const char *str);//构造函数,str是传入的参数       ~String();//析构函数       String(const String &other);//拷贝构造函数       String& operator=(const String &other);//赋值函数              private:       char *m_data;};String::String(const char *str){       if(NULL==str)//没有传入字符串       {            m_data=new char[1];//申请一个空间来存放\0,表示空串            *m_data='\0';       }       else       {             m_data=new char[strlen(str)+1];             strcpy(m_data,str); //将字符串内容复制到指针所指向的内存空间            }}String::~String(){        delete []m_data;}String::String(const String &other)//相当于对一个新的实例进行初始化化,other表示提供值的哪一个实例{        if(other.m_data==NULL)//判断指针是否为空        {               m_data=new char[1];               *m_data='\0';        }        else         {                m_data=new char[strlen(other.m_data)+1];//中间要求指针指向的那个字符的长度                strcpy(m_data,other.m_data);         }}String::String::operator=(const String &other)//赋值函数{      //检查自赋值      if(this==&other)           return *this;      //释放原因内存资源      delete []m_data;      //分配新的内存资源,并复制内容      int length=strlen(other.m_data);      m_data=new char[length+1];      strcpy(m_data,other.m_data);      return *this;//返回本对象的引用}
C++中的赋值和拷贝:

拷贝:对未初始化的内存进行初始化工作。

String s1("hello");    String s2(s1)//或String s2=s1;

赋值:对已初始化的内存进行再操作(重新赋值)
String s1("hello");    String s2;    String s2=s1;//s2已经被初始化过了,只不过初始化为空


int length=strlen(other.m_data)计算的是指针所指字符串长度而不是指针的长度。

注意sizeof和strlen

sizeof;C语言中判断数据类型或者表达式长度符(计算占用空间),是一个运算符,字节数的计算在程序的编译时进行,而不是在程序的执行过程中才算出来。(百度百科)

strlen:一个用来计数的函数,接收一个char *作为参数,碰到'\0'结束。所以必须是计算以'\0'结尾的(不包括'\0')。

#include<iostream>using namespace std;int main(){       char *str="123456";       cout<<str<<endl;//123456       cout<<sizeof(str)<<endl;//4,计算的指针的长度       cout<<strlen(str)<<endl;//6,计算指针指向的字符串的长度,不包括'\0'       char str1[]="123456";       cout<<str1<<endl;       cout<<sizeof(str1)<<endl;//7,计算整个字符串长度,包括'\0'(计算占用空间)       cout<<sizeof(str1)<<endl;//6       return 0;}
注意字符数组和指针指向的数组的区别。strlen一样,sizeof不一样。


赋值函数里面参数是cosnt

当other为const时,一个const变量不能随意转化为非const变量(拷贝构造函数也一样)。

String s3(hello);

Const string s4(haha);

s3=s4;


再看一段代码:

#include<iostream>using namespace std;class Parent{ public:      Parent(char *str,int var=-1)//带有默认实参的要在后面      {             m_data=str;             n=var;      }      void getn()      {              cout<<n<<endl;      }      void getChar()      {             cout<<m_data<<endl;      }private:       int n;       char *m_data;};class child:public Parent{ public:       child(char *str,int var=1):Parent(str)//初始化父类的指针变量       {              n=var;       }       void getn()       {             cout<<n<<endl;       }private:        int n;};int main(){        char *str="123";        child c1(str);        c1.getn();//1         c1.Parent::getn();//-1        c1.getChar();//123         return 0;}
父类的函数和变量不会因为同名而被子类覆盖,父类指针变量要指明初始化,其他变量可默认。





0 0