C++ 类的前向引用 和 explicit仅用于关闭构造函数的转换功能
2011-10-02 23:15
337 查看
前向引用声明
类应该先声明,后使用如果需要在某个类的声明之前,引用该类,则应进行前向引用声明(前置声明)。
前向引用声明只为程序引入一个标识符,但具体声明在其它地方。
eg:
class B; //前向引用声明
class A
{
public:
void f(B &b);
};
class B
{
public:
void g(A a);
};
前向引用声明注意事项
前向引用声明不是万能的。
尽管使用了前向引用声明,但在提供一个完整的类声明(定义性声明)之前,不能声明该类的对象,也不能在内联成员函数中使用该类的对象。
class Fred;//前向引用声明
class Barney
{
Fred x; //错误:类Fred的声明尚不完善
}
class Fred
{
Barney y; //正确,类 Barney已经实现了
};
应该记住:当你使用前向引用声明时,你只能使用被声明的符号,而不能涉及类的任何细节。
class Fred;//前向引用声明
class Barney {
public:
void method()
{
x->yabba();//错误:在内联成员函数中使用该类的对象
}
private:
Fred* x;//正确,可以声明Fred类的对象指针或引用
};
class Fred {
public:
void yabba();
private:
Barney* y;
};
explicit仅用于关闭构造函数的转换功能
构造函数的副作用构造函数的原本作用就是将依照实参构建起类的对象来。
这个过程实际上完成了数据的类型转换——外界的数据变成了对象。这是构造函数的副作用。也就是说,构造函数每逢被调用,皆有两种解释。于是给使用它埋下了隐患。因为C++的旧的类型转换方式恰恰使用类型名(被转换数) 这样的形式。这也恰是构造函数显式调用的形式。那么,这样写究竟是构建对象还是类型转换?为了分离这种一式二义性,C++提供了关键字explicit,用于关闭构造函数的转换功能。
explicit仅用于关闭构造函数的转换功能。
例:
class two;
class one
{
public: one( two &c) { } };
class two
{ public: two( const one & a) { } };
void func(twob) { }
{ }
void main()
{
one obj1;
func(obj1); //此时发生了二义
}
改造为:
class two;
class one
{ public: one( two &c) { } };
class two
{ public: explicit two( const one & a) { } };
void func(twob) { }
{ }
void main()
{
one obj1;
// func(obj1); //此时该语句错误
func( two(obj1) ); //必须显式使用转换
}
相关文章推荐
- C++ 构造函数放置默认转换explicit关键字(2)
- c++:explicit 抑制构造函数隐式转换
- C/C++日常学习总结(第十二篇)将构造函数声明为explicit(显式)的方式可以抑制隐式转换
- C++中的explicit作用功能(防止隐式转换)
- explicit:C++规定,当定义了只有一个参数的构造函数时,同时也定义了一种隐式的类型转换
- c++中关键字explicit用于类的构造函数
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
- C++中 類构造函数前面explicit的作用
- 从Qt谈到C++(一):关键字explicit与隐式类型转换
- c++中构造函数之前的explicit的作用
- C++12.4.4 隐式类类型转换----explicit
- Swig将C++编译lib项目转换为C#可引用的dll[勘误后]
- explicit只对构造函数起作用,用来抑制隐式转换
- 用于C/C++的繁简转换头文件
- C++基础1 C与C++的功能扩展语法增强 namesapce const 引用
- 让C++STL容器具有引用的功能
- c++ 防止隐式转换 explicit
- Poedu_C++_Lesson02_2_20161220_重载、默认实参、inline、类型转换、引用
- [C/C++不常见语法特性]_[强制显式调用构造函数explicit]
- 【c++程序】调用构造函数进行类型转换