美文网首页
C++第二三四周记录

C++第二三四周记录

作者: SYSinsight | 来源:发表于2017-07-11 14:16 被阅读0次

    date: 2017-03-28 20:03:30

    重定义默认参数

    • 代码举例
    class Students  {
    public:  
        Student(int n = 0, char *s = "no name");  
    };  
    Student::Student(int n = 0, char *s = "no name")  {  
        .... 
    }  
    

    语法规定:

    参数的默认值只可以出现在函数声明中,不可以出现在函数的定义中,否则会出现参数重复定义默认参数的错误:
    1.定义和声明分开:默认值只可以出现在声明中
    2.定义和声明不分开,默认值只能出现在定义中

    类中的const

    • const函数不能修改类成员的数据,同样的,const函数也只能调用其他的const函数(防止修改成员),否则会报错。
    • const成员或引用类型只能初始化,不能对他们赋值,所以要使用“类构造函数列表” 例:
    class sb{  
        private:  
            const int i;  
        public:  
            sb(int ii);  
    };  
    sb::sb(int ii):i(ii){} 
    

    如果改成

    sb::sb(int ii){
    i=ii;
    }
    

    则会报错

    拷贝构造函数与赋值函数

    class String  
    {
        public:
            String(const char *str);
            String(const String &other);//拷贝构造函数
            String & operator=(const String &other);//赋值函数,=运算符重载
            ~String(void); 
        private:
            char *m_data;
    };
    
    • 定义
     String::String(const String &other)
     {
         cout << "自定义拷贝构造函数" << endl;
         int length = strlen(other.m_data);
         m_data = new char[length + 1];
         strcpy(m_data, other.m_data);
     }
    
     String & String::operator=(const String &other)
     {
         cout << "自定义赋值函数" << endl; 
    
        if (this == &other)
        {
            return *this;
        }
        else
        {
            delete [] m_data;
            int length = strlen(other.m_data);
            m_data = new char[length + 1];
            strcpy(m_data, other.m_data);
            return *this;
        }
    }
    
    • Attention
      1. 拷贝构造函数只有在对象创建时可用,赋值函数只可用于已存在的对象
      2. 赋值函数先要预防自赋值,是危险操作,因为下面的delete []m_data会将自己释放成野指针
      3. delete的必要性:引用对象占空间可能与当前不一样,需要重新“按需分配空间”

    相关文章

      网友评论

          本文标题:C++第二三四周记录

          本文链接:https://www.haomeiwen.com/subject/esqmhxtx.html