C++语法__explicit, export, mutable

 

explicit

       A、B两个类,A的构造函数A(B b)/A(B& b),以A类对象为形参的函数调用Fun(A a),你可以直接传给Fun一个B类对象或者引用的实参。因为C++编译器会在argument赋值给parameter时,自动隐式调用A的构造函数,从而构建一个临时A对象,隐式转换 实现。

       但是在A的构造函数 用 explicit 修饰,编译器无法通过,因为explicit要求你进行 显示转换=显示调用构造函数,即 A(B),

       class B{……};

       class A{

       public:

              explicit A(const B& b) {……}

        };

        void f (A a) {……}

        int main ( ) {

              B b;

              f (b); // 错误(前面代码中无explicit时正确——调用Two(one)进行隐式类型转换)

              f (A(b)); // 正确——采用了显式类型转换

        }

export

 

 

       为了访问其他编译单元(如另一代码文件)中的变量或对象,对普通类型(包括基本数据类、结构和类),可以利用关键字extern,来使用这些变量或对象时;

       但是对模板类型,则必须在定义这些模板类对象和模板函数时,使用标准C++新增加的关键字export(导出/出口/输出)。例如:

       extern int n;

       extern struct Point p;

       extern class A a;

       export template<class T> class Stack<int> s;

       export template<class T> void f (T& t) {……}

       一般是在头文件中给出类的定义或全局函数的声明信息,而在代码文件中给出具体的(类成员函数或全局函数的)函数定义。然后在多个用户代码文件中包含该头文件后,就可以使用其中定义或声明的类和函数。头文件中一般不包含变量、结构和类对象的定义,因为这样可能会导致重复定义的编译错误。解决办法是,在某个代码文件中进行定义,在其他用户代码文件中用extern来引用它们。

       但是对模板类型,则可以在头文件中,声明模板类和模板函数;在代码文件中,使用关键字export来定义具体的模板类对象和模板函数;然后在其他用户代码文件中,包含声明头文件后,就可以使用该这些对象和函数了。例如:

       // out.h:(声明头文件——只包含out函数的声明信息)

       template<class T> void out (const T& t);

      // out.cpp:(定义代码文件——包含out函数的声明[通过include]和定义等全部信息)

      #include <iostream>

      #include “out.h”

      export template<class T> void out (const T& t) {std::cerr << t;}

      //user.cpp:(用户代码文件——包含函数的声明头文件后就可以使用该函数)

      #include “out.h”

      // 使用out()

mutable

      在类的常型(const)成员函数中,一般是不让改变类中数据成员的。如果想在常型成员函数中改变类的数据成员,在传统C++中,为达到此目,可采用一种奇怪的方式——先将this指针强制转换成一个本类的指针,然后就可以利用该指针来对类的数据成员进行任意的修改。但是,这种修改是隐藏在成员函数内部的,在类定义(头文件)中根本看不出来,而且它也破坏了设置常型成员函数的本意。

      标准C++中新增加了一个关键字mutable(易变/可变/不定/无常的),用在类的数据成员前,明确表示该成员变量可以在常型成员函数中被修改。例如:

class A {

       int i;

       mutable int j;

public:

       void f ( ) const;

};

void A::f ( ) const {

       i++; // 错误——常型成员函数不允许改变数据成员的值

       ((A*)this)->i++; // 可以——已经过时,不被提倡

       j++; // 正确——mutable型成员变量

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值