explicit 关键字阻止构造函数的隐式转换以及有参构造函数的显示、隐式调用方法

c++11起提供了关键字explicit,指定构造函数或转换函数显式, 即它不能用于隐式转换和复制初始化。

  • explicit 关键字作用于单个参数的构造函数。
  • explicit 关键字只能用于类内部的构造函数声明上。

前提知识:关于有参构造函数的三种调用方法,如下代码:

class Person{
public:
//无参构造函数
Person(){
        cout << "no param constructor!" << endl;
        mAge = 0;
        }
//有参构造函数
Person(int age){
       cout << "1 param constructor!" << endl;
       mAge = age;
       }
//拷贝构造函数(使用另一个对象初始化本对象)
Person(const Person& person){
       cout << "copy constructor!" << endl;
       mAge = person.mAge;
      }
//打印年龄
void PrintPerson(){
      cout << "Age:" << mAge << endl;
      }
private:
      int mAge;
};
//2. 调用有参构造函数
void test02(){
//第一种 括号法,最常用
    Person person01(100);
    person01.PrintPerson();
//调用拷贝构造函数
    Person person02(person01);
    person02.PrintPerson();
//第二种 匿名对象(显示调用构造函数)
    Person(200); //匿名对象,没有名字的对象
    Person person03 = Person(300);
    person03.PrintPerson();
//注意: 使用匿名对象初始化判断调用哪一个构造函数,要看匿名对象的参数类型
    Person person06(Person(400)); //等价于 Person person06 = Person(400);
//第三种 =号法 隐式转换
    Person person04 = 100; //Person person04 = Person(100)
    person04.PrintPerson();
    //调用拷贝构造
    Person person05 = person04; //Person person05 = Person(person04)
    person05.PrintPerson();
}
  • b 为 A 的实例化对象,A a = A(b) 和 A(b)的区别? 当 A(b) 有变量来接的时候,那么
    编译器认为他是一个匿名对象,当没有变量来接的时候,编译器认为你 A(b) 等价
    于 A b.
  • 注意:不能调用拷贝构造函数去初始化匿名对象,也就是说以下代码不正确
  • 匿名对象特点:当前行运行结束后,系统会自动回收掉当前对象。
  • 不能利用拷贝构造函数初始化匿名对象
class Teacher{
public:
      Teacher(){
      cout << "默认构造函数!" << endl;
      }
      Teacher(const Teacher& teacher){
      cout << "拷贝构造函数!" << endl;
      }
public:
      int mAge;
};
void test(){
      Teacher t1;
      //error C2086:“Teacher t1”: 重定义
      Teacher(t1); //此时等价于 Teacher t1;
}
posted @ 2023-10-21 17:46  zznic  阅读(45)  评论(0)    收藏  举报