C++的explicit关键字的使用场景

假若我们定义了Str类如下结构

class Str
{
  public:  

    Str(int n)  

    Str(const char* p)  

  .....  

}

可以使用如下方式来构建一个对象  

Str c(12);
Str d=Str(20);
Str *z=new Str(21);
Str a=10;//此处构建10个大小的空间
Str b="abcd";//此处构建特定字符串大小空间
Str f='f';   //与设计不相符的构建方式,这里会构建(int)'f'大小的内存空间

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

也许调用者是希望Str存'f'这一个字符,尽管Str没有提供这样的接口,但是编译的时候并不会报错,因为这里存在隐式转换,将char型转换为 Int型,这样就与调用者的初衷不符合了。而使用explicit可以杜绝这种隐式转换,在编译的时候就不会让其通过。可见explicit对于写一些基础库供他人调用还是非常有必要的.

代码:

#include<iostream>
using namespace std;  

class Str
{
public:
/*      explicit*/  Str(int n)//try explicit here
        {
                capacity=n;
                getmem();
        }
        Str(const char* p)
        {
                capacity=strlen(p)+1;
                getmem();
                strcpy(strarr,p);
        }
        ~Str()
        {
                if(strarr!=NULL)
                        free(strarr);
        }
        void printfvalue()
        {
                cout<<"len:"<<capacity<<"    str:"<<strarr<<endl;
        }
private:
        void getmem()
        {
                strarr=(char*)malloc(sizeof(char)*capacity);
        }
private:
        int  capacity;
        char *strarr;
};  

int main()
{
        Str c(12);
        Str d=Str(20);
        Str *z=new Str(21);
        Str a=10;
        Str b="abcd";
        Str f='f';
        c.printfvalue();
        d.printfvalue();
        z->printfvalue();  

        a.printfvalue();
        b.printfvalue();
        f.printfvalue();
        return 1;
}

出处[http://creator.cnblogs.com/]

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索编译
, char
, 空间
, 大小
, str
, explicit
explicit关键字
c explicit 关键字、explicit关键字、c 链表的使用场景、c explicit、c explicit 构造函数,以便于您获取更多的相关知识。

时间: 2024-12-21 23:57:32

C++的explicit关键字的使用场景的相关文章

c++中explicit关键字的含义和用法

c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的, 既然有"显式"那么必然就有"隐式",那么什么是显示而什 么又是隐式的呢? 如果c++类的构造函数有一个参数,那么在编译的时候 就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象 ,如下面所示: class MyClass { public: MyClass( int num ); } .... MyClass obj = 10; //ok,convert int to

C++中的explicit关键字用法

但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的.了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的,而且在编写自己的代码时也可以尝试使用.既然C++语言提供这种特性,我想在有些时候这种特性将会非常有用. 按默认规定,只用传一个参数的构造函数也定义了一个隐式转换.举个例子: (下面这个CExample没有什么实际的意义,主要是用来说明问题)  代码如下 复制代码 //Example.h #pragma once class

C++ explicit关键字的应用方法详细讲解_C 语言

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

C++ Explicit关键字详细解析_C 语言

explicit关键字用来修饰类的构造函数,表明构造函数是显示的,相对的是implicit关键字.首先这个关键字只能用在类内部的构造函数声明上,而不能用在类外部的函数定义上,它的作用是不能进行隐式转换. 复制代码 代码如下:     class gxgExplicit  //没有关键字explicit的类    {      public:          int _size;         gxgExplicit(int size)        {           _size = s

C++关键字之:explicit

一.文章来由 c++基础知识繁多,对于不太常用,易用错的关键字需要总结一下. 二.explicit关键字作用 (1)explicit关键字只是用来修饰构造函数的,而且它只会出现在类中的构造函数声明之前(定义之前再出现就错了). (2)explicit关键字是用来抑制由构造函数定义的隐式转换的. 三.构造函数定义的隐式转换 如下代码: class MyClass { public: MyClass( int num ); } MyClass obj = 10; //ok,convert int t

C# 自定义 implicit和explicit转换

explicit 和 implicit 属于转换运算符,如用这两者可以让我们自定义的类型支持相互交换explicti 表示显式转换,如从 A -> B 必须进行强制类型转换(B = (B)A)implicit 表示隐式转换,如从 B -> A 只需直接赋值(A = B) 隐式转换可以让我们的代码看上去更漂亮.更简洁易懂,所以最好多使用 implicit 运算符.不过!如果对象本身在转换时会损失一些信息(如精度),那么我们只能使用 explicit 运算符,以便在编译期就能警告客户调用 name

C++知识点---explicit、TR1、Boost

关键字:explicit 1.除非有明显的理由想要定义隐式转换,否则,单形参构造函数应该为explicit. 将构造函数设置为explicit可以避免错误,并且当转换有用时.用户可以显式地构造对象. 2.explicit关键字只能用于类内部的构造函数声明上.在类的定义体外部所做的定义上不再 重复它. 参考:<C++ Primer> 12.4.4 TR1 TRI ("Technical Report I") 是一份规范,描述加入 C++ 标准程序库的诸多新机 能.这些机能以新

深入分析C++中几个最不常用的关键字_C 语言

mutable关键字关键字mutable是C++中一个不常用的关键字,他只能用于类的非静态和非常量数据成员我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,对像的状态也会随之发生变化!如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员.但是有些时候需要在该类函数中对类的数据成员进行赋值.这个时候就需要用到mutable关键字了例如: 复制代码 代码如下: class Demo{public:    Demo(

C++中explict关键字用法_C 语言

C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用. c++规定:对于可能只需传一个参数的默认构造函数,都定义了一种隐式调用. 注意:只需传一个参数不仅指的是只有一个参数的默认构造函数,也指那些包含了定义了参数默认值的那些默认构造函数. 举例说明: class MyClass { public: MyClass(); MyClass(string s); MyClass(int i, int y =