zoukankan      html  css  js  c++  java
  • C++类的默认成员函数

    成员函数隐含this指针参数:

    每成员函数一个隐式的指针形参(构造函数除外);

    对象在调用成员函数时,编译器会将对象的地址传递给this指针;

    1、构造函数(需用一个公有成员函数对私有的成员变量进行初始化,在对象构造时执行一次,无参的构造函数和带缺省值的构造函数都是缺省构造函数 ,缺省的构造函数只能有一个)

    Mystring(const char *str="")//带缺省值的构造函数
    {
        _str = new char[strlen(str) + 1];
        strcpy(_str, str);
    }

    2、拷贝构造函数(使用同类对象来初始化;构造函数的重载;若未显示定,系统会调缺省的拷贝构造函数,缺省的拷贝构造函数会依次拷贝类成员进行初始化)

        Mystring(const Mystring& s)
        {
            _str = new char[strlen(s._str) + 1];
            strcpy(_str, s._str);
        }
    Mystring s1;
    拷贝构造函数的2种调用方式
    Mystring s2(s1);
    Mystring s3=s2;

    但为什么拷贝构造函数传递的参数为引用呢?

    使用传值传递会引发无穷递归调用,如上的调用方式,拷贝构造函数传入的参数为Mystring的一个实例s,由于是传值参数,所以会把形参s复制到实参s1又调用拷贝构造函数,所以会无穷的递归

    3、析构函数(当一个对象的生命周期结束时,c++编译器会自动调用析构函数;负责做一些清理工作)

        ~Mystring()
        {
            if (_str)
                delete[]_str;
        }

    4、赋值运算符的重载

        Mystring& operator=(const Mystring& s)
        {
            if (this != &s)
            {
                char *tmp = new char[strlen(s._str) + 1];
                delete[] _str;
                _str = tmp;
                strcpy(_str, s._str);
            }
            return *this;
        }

         Mystring s4;
         s4 = s1;

     

    a、将返回值类型声明为该类型的引用,并在函数结束前返回实例自身的引用才能支持连续复制如(s1=s2=s3);?为什么

             引用是左值(可以放在赋值运算符的左边),返回引用可以直接操作,也就可以进行连续赋值;所以s3将值复制给s2后,s2还能将值复制给s1

    另外,引用作为返回值有以下几点:(使用值作为返回值会创建临时变量存储返回值,因为函数返回时局部变量会被释放必须用临时变量存储,指针也是如此,只不过临时变量里存                                               的时临时变量的地址。

             在类的成员函数中,返回引用的类对象,当然不能是函数内定义的类对象(会释放掉),一般为this指向的对象;

             不要返回局部对象的引用 ,当函数执行完毕,程序将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。

    b、将传入的参数申明为常量的引用,就不用调用拷贝构造函数以免不必要的消耗;

    c、在分配新内存前释放自身已有的内存,以防内存泄露;

    d、判断传入的参数和当前的实例(*this)是不是同一个实例,若为同一个实例时一旦释放内存,传入参数的内存也就被释放了,再也找不到需要复制的内容了。

     

  • 相关阅读:
    代码重构~提取方法
    代码重构~提取到类
    不说技术~有时,开发者还是应该讲究一点!
    代码重构~封装成员变量
    将不确定变为确定~LINQ查询包含对不同数据上下文上所定义项的引用
    真实的用户,真实的中国互联网
    John Resig: JavaScript's Chuck Norris
    chrome插件IE tab使用技巧
    人生的疆域与生存的幻象—阅读丰富人生
    WPF 创建多行TextBox
  • 原文地址:https://www.cnblogs.com/Blog-day/p/My_Blog_Days1-28.html
Copyright © 2011-2022 走看看