`
izuoyan
  • 浏览: 9222417 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

c++ is on the way 7:显式构造函数

阅读更多

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++构造函数详解及显式调用构造函数.doc

    C++中的构造函数是类的一个特殊成员函数,其主要任务是初始化对象的数据成员。当我们创建一个类的实例时,构造函数会被自动调用,确保对象在使用前处于正确的初始状态。下面将详细解释构造函数的种类及其作用。 1. ...

    C++程序设计课件:3 构造函数、析构函数.ppt

    在C++编程语言中,构造函数和析构函数是类的重要组成部分,它们分别负责对象的初始化和清理工作。本文将详细讲解这两个概念以及相关的知识点。 首先,构造函数是一种特殊的成员函数,它的主要任务是在创建对象时对...

    完全掌握C++编程中构造函数使用的超级学习教程

    例如,如果`Box`有一个接受单个整数参数的构造函数,显式构造函数可以防止像`Box b = 42;`这样的隐式转换。 7. C++11新特性: C++11引入了一些关于构造函数的新特性,如列表初始化、移动构造函数和拷贝构造函数的...

    详解在C++中显式默认设置的函数和已删除的函数的方法

    在 C++11 中,默认函数和已删除函数使你可以显式控制是否自动生成特殊成员函数。已删除的函数还可为您提供简单语言,以防止所有类型的函数(特殊成员函数和普通成员函数以及非成员函数)的参数中出现有问题的类型...

    包含构造函数和析构函数的C++程序

    ### 构造函数和析构函数在C++中的应用 #### 概述 构造函数与析构函数是C++编程语言中非常重要的概念,它们在类的实例化和销毁过程中扮演着关键角色。通过理解这些函数的工作原理及其作用,我们可以更好地控制对象...

    C++构造函数初始化列表

    ### C++构造函数初始化列表详解 在C++编程语言中,构造函数是对象生命周期开始时自动调用的特殊成员函数,用于初始化对象的状态。构造函数初始化列表是C++中一个非常重要的特性,它允许程序员在对象创建时直接对类...

    C++实现 类string的 普通构造函数, 拷贝构造函数 析构函数 和赋值函数

    在自定义类设计中,通常需要实现四个特殊成员函数:普通构造函数、拷贝构造函数、析构函数和赋值运算符。这些函数是面向对象编程中的核心组成部分,对于理解和创建高效、安全的对象至关重要。 **普通构造函数**: ...

    浅谈C++ Explicit Constructors(显式构造函数)

    C++中的显式构造函数(Explicit Constructors)是编程实践中一个重要的概念,主要用来控制类对象的隐式类型转换。在C++中,如果一个类有一个只接受一个参数的构造函数,那么这个构造函数可以被用来进行隐式类型转换...

    论C++构造函数中的不合理设计

    ### 论C++构造函数中的不合理设计 #### 概述 C++作为一种广泛使用的编程语言,在面向对象编程领域占据着重要地位。构造函数作为类的一部分,用于初始化对象的状态,是C++中非常重要的一种机制。然而,构造函数的...

    C++简单类(构造函数,析构函数以及拷贝构造函数)的实现

    本文将详细解析一个简单的C++类`cPerson`的实现,重点关注其构造函数、析构函数以及拷贝构造函数。 ### 构造函数 构造函数是在创建类的对象时自动调用的一种特殊成员函数,主要用于初始化对象的数据成员。`cPerson...

    构造函数的显式调用+构造函数的重载.cpp

    面向对象程序设计,即C++语言,类。构造函数的显示调用+构造函数的重载,文件里面有详细的注释。

    C++ 拷贝构造函数 赋值构造函数

    C++ 拷贝构造函数 赋值构造函数 解释

    c++构造函数小测验

    本次小测验的主题是C++构造函数的相关知识点,包括构造函数的种类、调用时机以及构造函数的实现方式等。 首先,我们看到给定的代码片段中出现了Student类和Sprite类的定义,这两个类都是C++中类的典型示例。Student...

    C++构造函数

    C++构造函数详解 在C++中,构造函数是一种特殊的成员函数,它们用于初始化类的对象。在本文中,我们将详细介绍C++构造函数的种类、特点和用法。 一、 构造函数的定义和作用 构造函数是类的成员函数,它们用于初始...

    c++ 类的定义 和构造函数

    1. **默认构造函数**:无参数的构造函数称为默认构造函数,如果没有显式定义,编译器会自动提供一个默认构造函数。 ```cpp class Person { public: Person() : age(0), name("") {} // 默认构造函数 private: ...

    C++构造函数重载

    在C++编程语言中,构造函数是类的一个特殊成员函数,它的主要职责是初始化新创建的对象。当一个类有多个构造函数,每个函数具有不同的参数列表时,我们称这种情况为构造函数的重载(Overloaded Constructors)。这种...

    c++(7) 构造和析构函数

    ### C++中的构造和析构函数 构造函数与析构函数是C++中非常重要的概念,它们对于确保类实例的正确初始化与清理至关重要。本文将详细介绍构造函数与析构函数的相关知识点。 #### 一、构造函数 构造函数是一种特殊...

    C++复制构造函数详解

    在C++编程语言中,复制构造函数是一种特殊的构造函数,它的主要作用是创建一个对象的新副本。当一个已存在的对象被用作创建新对象的初始值时,复制构造函数会被调用。理解复制构造函数的工作原理及其应用是C++程序员...

    类构造函数 the c++ programming language

    ### 类构造函数在C++编程语言中的应用 #### 基础概念 构造函数是C++编程语言中类的一个特殊成员函数,它主要用于初始化新创建的对象。与普通成员函数不同,构造函数没有返回类型(即使是`void`也不允许),并且其...

Global site tag (gtag.js) - Google Analytics