C++ explicit 关键字

explicit 修饰只有一个参数的构造函数,以防止从参数类型到目标类类型的隐式转换。

// stdmove.cpp -- using std::move()
#include <iostream>
#include <utility>
using std::cout;
using std::endl;

// use the following for g++4.5
// #define nullptr 0
// interface
class Useless
{
private:
    int n;          // number of elements
    char * pc;      // pointer to data
    static int ct;  // number of objects
public:
    Useless();
    explicit Useless(int k);
    Useless(int k, char ch);
    Useless(const Useless & f); // regular copy constructor
    ~Useless();
    Useless & operator=(const Useless & f); // copy assignment
    void ShowObject() const;
};

// implementation
int Useless::ct = 0;

Useless::Useless()
{
    cout << "enter " << __func__ << "()\n";
    ++ct;
    n = 0;
    pc = nullptr;
    ShowObject();
    cout << "leave " << __func__ << "()\n";
 }

Useless::Useless(int k) : n(k)
{
    cout << "enter " << __func__ << "(k)\n";
    ++ct; 
    pc = new char[n];
    ShowObject();
    cout << "leave " << __func__ << "(k)\n";
}

Useless::Useless(int k, char ch) : n(k)
{
    cout << "enter " << __func__ << "(k, ch)\n";
    ++ct;
    pc = new char[n];
    for (int i = 0; i < n; i++)
        pc[i] = ch;
    ShowObject();
    cout << "leave " << __func__ << "(k, ch)\n";
}

Useless::Useless(const Useless & f): n(f.n) 
{
    cout << "enter " << __func__ << "(const &)\n";
    ++ct;
    pc = new char[n];
    for (int i = 0; i < n; i++)
        pc[i] = f.pc[i];
    ShowObject();
    cout << "leave " << __func__ << "(const &)\n";
}

Useless::~Useless()
{
    cout << "enter " << __func__ << "()\n";
    ShowObject();
    --ct;
    delete [] pc;
    cout << "leave " << __func__ << "()\n";
}

Useless & Useless::operator=(const Useless & f)  // copy assignment
{
    cout << "enter " << __func__ << "(const &)\n";
    ShowObject();
    f.ShowObject();
    if (this == &f)
        return *this;
    delete [] pc;
    n = f.n;
    pc = new char[n];
    for (int i = 0; i < n; i++)
        pc[i] = f.pc[i];
    ShowObject();
    cout << "leave " << __func__ << "(const &)\n";
    return *this;
}

void Useless::ShowObject() const
{ 
    cout << "\t this=" << this << ", ct=" << ct; 
    cout << ", pc=(" << n << ", " << (void*)pc << ", "; 
    if (n == 0)
        cout << "(object empty)";
    else
        for (int i = 0; i < n; i++)
            cout << pc[i];
    cout << " )." << endl;
}

int main()
{
    Useless obj1(10);
    Useless obj2=5;
}

说明:

//显式调用构造函数 ”explicit Useless(int k);”

Useless obj1(10);

//隐式调用构造函数 ”explicit Useless(int k);”。由于有explicit修饰,发生编译错误。

//error: conversion from ‘int’ to non-scalar type ‘Useless’ requested

//Useless obj2=5;

时间: 2024-10-19 01:44:37

C++ explicit 关键字的相关文章

【转】C++中的explicit关键字

在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上.再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决.但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的.了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的,而且在编写自己的代码时也可以尝试使用.既然C++语言提供这种特性,我想在有些时候这种特性将会非常有用. 按默认规定,只用传一个参数的构造函数也定义了一个隐式转换.举

&lt;转&gt;C++ explicit关键字详解

要文转自:http://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式). 那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子: class CxString // 没有使用explicit关键字的类声明, 即默

C++中的explicit关键字的用法

一.explicit作用: 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. 二.explicit使用注意事项: explicit 关键字只能用于类内部的构造函数声明上. explicit 关键字作用于单个参数的构造函数. 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换 参考博客:http://www.cnblogs.com/this-54327365

C++中 explicit 关键字

阅读了 effective c++中关于初始化部分知识,其中提到了explicit关键字 explicit作用: 防止构造函数执行隐式类型转换 要明白它的作用,首先要了解隐式转换: 我们来构造一个隐式调用 方法:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换. 例如: <span style="font-size:18px;">class B{ public: B(int x); void dosomething(B bobject); }</

C++ explicit关键字应用方法详解

C++编程语言中有很多比较重要的关键字在实际编程中起着非常重要的作用.我们今天为大家介绍的C++ explicit关键字就是其中一个应用比较频繁的关键字.下面就让我们一起来看看这方面的知识吧. C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢? 如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面

C++中explicit关键字的作用

转自:http://www.cnblogs.com/winnersun/archive/2011/07/16/2108440.html explicit用来防止由构造函数定义的隐式转换. 要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换. 例如: class things{ public: things(const std::string&name =""): m_name(name),height(0),weight(

c++ explicit关键字

explicit关键字不经常看到,切实比较生僻.今天总结一下. C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用. 这是百度百科给的定义. 从定义上来看大概可以明白什么意思. 具体作用如下: explicit构造函数的作用解析: explicit构造函数是用来防止隐式转换的.请看下面的代码: Test1的构造函数带一个int型的参数,代码23行会隐式转换成调用Test1的这个构造函数.而Test2的

C++中的explicit关键字(转)

按默认规定,只用传一个参数的构造函数也定义了一个隐式转换.举个例子: #pragma once class CExample { public: CExample(void); CExample(int iFirst, int iSecond = 4); ~CExample(void); public: int m_iFirst; int m_iSecond; }; #include "StdAfx.h" #include "Example.h" CExample:

C++ Primer 学习笔记_18_类与数据抽象(4)_构造函数、析构函数、explicit关键字、赋值与初始化、类成员的显式初始化

引言: 构造函数确保每个对象在创建时自动调用,以确保每个对象的数据成员都有合适的初始值. 一.构造函数.默认构造函数 1.构造函数 --构造函数是特殊的成员函数 --构造函数是为了保证对象的每个数据成员都被正确初始化 --函数名和类名完全相同 --不能定义构造函数的类型(返回类型),也不能使用void --通常情况下构造函数应声明为公有函数,一般被隐式地调用. --构造函数被声明为私有有特殊的用途,比如单例模式. (1).构造函数可以被重载 一般而言,不同的构造函数允许用户指定不同的方式来初始化

C++ 中explicit关键字

explicit用来防止由单参数构造函数定义的隐式转换,但是另外一种情况例外:其中只有一个必须输入的参数,其余的为有默认值的参数. 先扫盲下什么是隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换. eg: class things { public: things(string &name = ""): m_name(name),height(0),weight(10){} int CompareTo(const things & oth