- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章c/c++拷贝构造函数和关键字explicit详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
关键字explicit 。
修饰构造方法的关键字,加上了,就告诉编译器,不可以隐式初始化对象;不加就可以隐式初始化对象; 下面的代码是可以正常编译执行的,但是加了关键字explicit,编译就会错我,因为Test t = 100;是隐式初始化对象,但是如果加上强制类型转换后,就不会有错误了.
强制类型转换:Test t = (Test)100,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
class
Test{
public
:
Test(
int
d):data(d){
//explicit
cout <<
"C:"
<<
this
<< endl;
}
}
int
main(){
Test t = 100;
}
拷贝构造函数如果加上了
explicit
,下面的语句就无法编译通过;不加可以。
class
Test{
public
:
//拷贝构造函数
explicit
Test(
const
Test &t){
data = t.data;
}
int
getData(){
return
data;
}
private
:
int
data;
};
void
test(Test x){
}
int
main(){
Test t2(t1);
//调用拷贝构造函数
//Test t3 = t2;//编译不过
//test(t2);//编译不过
}
|
触发拷贝构造函数的4种方式 。
1,Test t2(t1);//调用拷贝构造函数 。
2,声明的同时就赋值Test t3 = t2会调用拷贝构造函数;但是注意下面这种不会调用拷贝构造函数.
Test t3,
t3 = t2;//会调用=的重载方法 。
3,方法的参数是对象类型test(t2),
4,方法的返回值是对象类型。原因:对象tmp在方法结束后就被释放掉了,要返回到函数外,必须要复制tmp. 。
但是用gdb看了一下在return处并没有调用拷贝构造函数,所以test方法结束后,tmp也没有被释放,调用test方法的t5的内存地址和tmp是一样的。个人猜测:老版本的gcc编译器可能会在return处调用拷贝构造函数,但是新的编译器(gcc 4.8.5-20)为了提高效率,避免了一次多余的拷贝.
1
2
3
4
5
6
7
|
void
test(Test x){
//进入函数的时点会调用拷贝构造函数
int
value;
value = x.getData();
Test tmp(value);
return
tmp;
//return的时点会调用拷贝构造函数
}
Test t5 = test(t1);
|
原文链接:https://www.cnblogs.com/xiaoshiwang/archive/2018/08/17/9491296.html 。
最后此篇关于c/c++拷贝构造函数和关键字explicit详解的文章就讲到这里了,如果你想了解更多关于c/c++拷贝构造函数和关键字explicit详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个基类和两个派生类,我需要将一个指向派生类对象的指针复制到另一个类中,就像示例一样。 class Base { public: Base(const Base& other); } cl
考虑 Container 类,它主要存储 Box 对象的 unique_ptr vector ,并可以对它们执行一些计算。 class Container { private: std::
引用是指保存的值为对象的地址。在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用,因此对于它们的使用就需要小心一些。下面举个例子: 问题描述:已知一个列表,求生成一个
我正在尝试实现 Bron-Kerbosch 算法,这是一种用于查找派系的递归算法。我设法达到了一个点,它返回了正确数量的派系,但是当我打印它们时,它们不正确 - 添加了额外的节点。我在这里遗漏了什么明
在评估中,我选择了选项LINE I 上的运行时错误。没有未定义行为这样的选项,尽管我认为这是正确的选择。 我不确定,但我认为评估有误。我编译并运行了该程序,它确实打印了 3, 9, 0, 2, 1,
在函数签名中通过 const 值传递参数是否有任何好处(或相反,成本)? 所以: void foo( size_t nValue ) { // ... 对比 void foo( const s
我为 answer to another question 写了一个 OutputIterator .在这里: #include using namespace std; template clas
我有一个由第三方生成的 dll,它具有某种内部数据结构,将其大小限制为 X 个元素。 所以基本上,它有一个以 X 为限制的队列。 据我所知,DLL 是每个进程的,但是是否可以多次加载 DLL?也许每个
假设我有以下两个数据结构: std::vector all_items; std::set bad_items; all_items vector 包含所有已知项和 bad_items vector
如何在不渲染 CGImage 的情况下从另一个 CIImage 复制一个 CIImage 最佳答案 CIImage *copiedImage = [originalImage copy]; 正如您在
我有一个名为 UINode 的 GUI,我想创建一个拷贝并只更改一些内容。该项目由 3 个基本线程组成。 PingThread、RosThread 和 GuiThread。我试图复制粘贴项目文件夹并将
Qt 新手。如果这个问题太幼稚,请多多包涵。在 Windows 操作系统环境中,我有 Qt 对话框框架应用程序,它具有“重复”- 按钮。在同一目录中,有 Qt 应用程序 - (一个带有关闭按钮的对话框
我正在尝试创建一个函数来复制我的卡片结构。我只需复制 cvalue 即可轻松开始。然而,我的 cvalue 没有复制,当应该读取 1000 时它仍然读取 5。 #include #include
string str1("someString"); string str2 = string(str1);//how many copies are made here //copy2 =
我希望了解 boost::bind 执行何种函数对象的内部拷贝。由于这些对象的构造函数似乎没有被调用,我推测这是一种“非常浅的复制”,所以我引入了动态内存分配来产生一些错误。但是,下面代码的运行时输出
我正在查看 http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#c22-make-default-operations-consis
下面的类方法Augmented3dPoint::getWorldPoint()返回对其成员的引用 cv::Point3f world_point; class Augmented3dPoint { p
我需要通过 MyClass2 将用户定义的 lambda 传递给 MyClass1。我想确保只有一步,没有拷贝。下面的代码实现了吗?有没有更好的方法来做到这一点(比如使用编译器完成的隐式移动)? 注意
在我的数据库访问代码中,我想写一个方法: variant_t GetQueryRows (...) 我想这样调用它: const variant_t result = GetQueryRows (..
我有一个包含引用的类,例如: class A { A(B &b) : b(b) {} // constructor B &b; } 有时b必须是只读的,有时是可写的。当我创建一个 const A
我是一名优秀的程序员,十分优秀!