码迷,mamicode.com
首页 > 编程语言 > 详细

C++ explicit 关键字

时间:2017-06-13 14:23:20      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:c++

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;


本文出自 “用C++写诗” 博客,谢绝转载!

C++ explicit 关键字

标签:c++

原文地址:http://frankniefaquan.blog.51cto.com/12613979/1934789

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!