• 对象型参数和返回值-匿名对象(临时对象)-隐式构造、explicit_


    对象型参数和返回值

    使用对象类型作为函数的参数或者返回值,可能会产生一些中间对象

    • 尽量不要使用对象作为参数,使用引用来访问外部对象的内容
    void test1(Car &car) {}
    
    • 返回值是对象的话,也会生成中间对象
    Car test2() {
        Car car;
        return car;
    }
    
    int main() {
        Car car2;
        car2 = test2();    //这里函数调用完以后马上就销毁,如果不生成一个中间对象的话,无法赋值给car2
    }
    

    匿名对象(临时对象)

    • 匿名对象:没有变量名、没有被指针指向的对象,用完后马上调用析构
    class Car {
    public:
        Car() { ...}
        ...
    }
    
    int main() {
        Car();    //这就是匿名对象,没有名字,用完就不要了
    }
    

    隐式构造

    • C++中存在隐式构造的现象:某些情况下,会隐式调用单参数的构造函数
    Person p1 = 20;    //相当于 Person p1(20);
    
    Person p1;
    p1 = 40;    //相当于 p1 = Person(40);    
    
    • 可以通过关键字explicit禁止掉隐式构造
    class Person {
    public:
        explicit Person(int age) :m_age(age) { 
            cout << "Person(int) - " << this << endl;
        }
        ...
    }
    

    编译器自动生成的构造函数

    • C++编译器在某些特定情况下,会给类自动生成无参的构造函数
      ** 成员变量在声明的同时初始化
      ** 有虚函数就会
      ** 虚继承其他类
      ** 包含了对象类型的成员,且这个成员有构造函数(编译器生成或自定义)
  • 相关阅读:
    半夜的时候,干了个活,反了个小软件
    bzoj2243[SDOI2011]染色
    bzoj4034[HAOI2015]T2
    bzoj2661[BeiJing wc2012]连连看
    bzoj1406[AHOI2007]密码箱
    bzoj1452[JSOI2009]Count
    bzoj1934[Shoi2007]Vote 善意的投票
    bzoj1787[Ahoi2008]Meet 紧急集合&bzoj1832[AHOI2008]聚会
    bzoj1293[SCOI2009]生日礼物
    bzoj1221[HNOI2001] 软件开发
  • 原文地址:https://www.cnblogs.com/sec875/p/12555552.html
Copyright © 2020-2023  润新知