1.什么是显式构造函数?
首先要理解什么是隐式构造函数,并且弄清它的优缺点。
#include <iostream>
using std::cout;
using std::endl;
class complexNumbers {
double real, img;
public:
complexNumbers() : real(0), img(0) { }
complexNumbers(const complexNumbers& c) { real = c.real; img = c.img; }
complexNumbers( double r, double i = 0.0) { real = r; img = i; }
friend void display(complexNumbers cx);
};
void display(complexNumbers cx){
cout<<"Real Part: "<<cx.real<<"Imag Part: "<<cx.img<<endl;
}
int main() {
complexNumbers one(1);
complexNumbers five = 5;
display(one);
display(five);
return 0;
}
在这段代码中,我们定义一个复数的模型,并且定义了三个构造函数,一个默认构造函数(第一个),一个复制构造函数(第二个),第三个就是帮助我们实现隐式构造的构造函数。我们在主程序中使用了这个函数定义了两个对象:
输出为:
Real Part: 1 Imag Part: 0
Real Part: 5 Imag Part: 0
此时并没有什么问题,我们在主程序中加入一句话:display(300); 然后看结果,多打印了一行:
Real Part: 300 Imag Part: 0
这并非我们希望出现的结果,那这是如何发生的呢?
这里display函数发现传入的是一个数字300时,与它期待的类型(complexNumbers)不符合,它就隐式调用了构造函数进行对象的构造,产生一个临时complexNumbers的实例对象。这种情况发生在存在可以接受一个参数的构造函数中(除复制构造函数)。
解决这个问题的方式就是强迫编译器必须使用显式构造的方式创建对象,这要在构造函数前使用explicit 关键字。回到这个例子,加上explicit后程序无法编译,这样就解决了该问题。如果还想方便使用的话只能如此显式创建对象:
display(complexNumbers(200));
2.使用建议
在Google Style中,有明文要求在可以接受一个参数的构造函数(除复制构造函数)中必须使用explicit关键字防止这样的情况。
分享到:
相关推荐
C++ 构造函数详解及显式调用构造函数 C++ 中的构造函数是一种特殊的成员函数,用于初始化对象的数据成员。构造函数的名称与类名相同,且无返回类型。构造函数可以分为四种:无参数构造函数、一般构造函数、复制...
C++中的构造函数是类的一个特殊成员函数,其主要任务是初始化对象的数据成员。当我们创建一个类的实例时,构造函数会被自动调用,确保对象在使用前处于正确的初始状态。下面将详细解释构造函数的种类及其作用。 1. ...
例如,如果`Box`有一个接受单个整数参数的构造函数,显式构造函数可以防止像`Box b = 42;`这样的隐式转换。 7. C++11新特性: C++11引入了一些关于构造函数的新特性,如列表初始化、移动构造函数和拷贝构造函数的...
在 C++11 中,默认函数和已删除函数使你可以显式控制是否自动生成特殊成员函数。已删除的函数还可为您提供简单语言,以防止所有类型的函数(特殊成员函数和普通成员函数以及非成员函数)的参数中出现有问题的类型...
### 构造函数和析构函数在C++中的应用 #### 概述 构造函数与析构函数是C++编程语言中非常重要的概念,它们在类的实例化和销毁过程中扮演着关键角色。通过理解这些函数的工作原理及其作用,我们可以更好地控制对象...
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法。下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它...
### C++构造函数初始化列表详解 在C++编程语言中,构造函数是对象生命周期开始时自动调用的特殊成员函数,用于初始化对象的状态。构造函数初始化列表是C++中一个非常重要的特性,它允许程序员在对象创建时直接对类...
在自定义类设计中,通常需要实现四个特殊成员函数:普通构造函数、拷贝构造函数、析构函数和赋值运算符。这些函数是面向对象编程中的核心组成部分,对于理解和创建高效、安全的对象至关重要。 **普通构造函数**: ...
如果类中没有显式定义构造函数,那么编译器通常会为我们定义(合成)一个默认的构造函数。 复制构造函数是一种特殊的构造函数,它的主要作用是将一个对象的状态复制到另一个对象中。复制构造函数的名称与类名相同,...
本文将详细解析一个简单的C++类`cPerson`的实现,重点关注其构造函数、析构函数以及拷贝构造函数。 ### 构造函数 构造函数是在创建类的对象时自动调用的一种特殊成员函数,主要用于初始化对象的数据成员。`cPerson...
面向对象程序设计,即C++语言,类。构造函数的显示调用+构造函数的重载,文件里面有详细的注释。
C++ 拷贝构造函数 赋值构造函数 解释
本次小测验的主题是C++构造函数的相关知识点,包括构造函数的种类、调用时机以及构造函数的实现方式等。 首先,我们看到给定的代码片段中出现了Student类和Sprite类的定义,这两个类都是C++中类的典型示例。Student...
C++构造函数详解 在C++中,构造函数是一种特殊的成员函数,它们用于初始化类的对象。在本文中,我们将详细介绍C++构造函数的种类、特点和用法。 一、 构造函数的定义和作用 构造函数是类的成员函数,它们用于初始...
2. 显式构造函数调用:可以使用成员初始化列表(member initialization list)来指定子对象的构造函数,并传递参数。这种方式可以提高效率,因为避免了默认构造后再赋值的额外开销。 三、派生类构造函数 1. 继承...
当程序员没有显式地定义任何构造函数时,C++编译器会自动为类提供一个默认构造函数,这个构造函数是无参数的,其主要任务仅仅是创建对象,而不会对对象的成员进行任何初始化操作。 首先,每个类至少需要有一个构造...
1. **默认构造函数**:无参数的构造函数称为默认构造函数,如果没有显式定义,编译器会自动提供一个默认构造函数。 ```cpp class Person { public: Person() : age(0), name("") {} // 默认构造函数 private: ...
如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝。 自定义拷贝构造函数是一种良好的编程风格,它可以阻止编译器形成默认的拷贝构造...
### C++中的构造和析构函数 构造函数与析构函数是C++中非常重要的概念,它们对于确保类实例的正确初始化与清理至关重要。本文将详细介绍构造函数与析构函数的相关知识点。 #### 一、构造函数 构造函数是一种特殊...