c++ 构造/析构default之蛋蛋

15 篇文章 0 订阅
6 篇文章 0 订阅

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">最近写代码,发现一件很有趣的事情,幸好我很快就发现了,否则就不是有趣而是头疼了!</span>

ok,下面我有这么一段代码:

#include <memory>
#include <cstdint>

struct CurlWriteData
{
	static const uint32_t BUFFER_SIZE = 1024 * 1024; //1MB
	typedef std::shared_ptr<char> CharPtr;

	char* Buffer() const { return _buffer.get(); }
	uint32_t _size = 0;
	uint32_t _offset = 0;

	//CurlWriteData() = delete;
	CurlWriteData(uint32_t buffer_size = BUFFER_SIZE)
	{
		if (_buffer){ return; }
		if (!buffer_size){ return; }
		_size = buffer_size;
		_buffer = CharPtr(new char[buffer_size], [](char* ptr){ if (ptr){ delete[] ptr; } });
	}
private:
	CharPtr _buffer;
};

这段代码太简单了,就是一个结构体,而且还有一个带默认参数的构造函数。

默认构造1MB的内存缓冲区。下面我们可以这样定义:

CurlWriteData buffer_a;

CurlWriteData buffer_b(1024);

这样的定义看起来没错,的确没错,一般好像都这样用。


下来因为c++0x的构造函数可以使用default变的有趣。

下面是我一个类对象的使用。代码:

class TestA
{
public:
	TestA() = default;
private:
	CurlWriteData _curl_wtire_data;
};

这样用初看起来没问题,就是这样,创建类对象的时候就创建了CurlWriteData对象,而且应该会调用CurlWriteData的构造函数,而因为CurlWriteData构造函数使用的默认参数,所以他应该会分配1MB的内存。

结果却不是这样,我现在突然发现我对default关键字一无所知,这里先给一些朋友提醒一下。

事实上,在创建TestA对象时,TestA对象并没有构造_curl_write_data对象,我打断点调试,他并没有走到CurlWriteData(uint32_t buffer_size = BUFFER_SIZE)里面。

ok,那试试什么都没有的默认构造函数吧,CurlWriteData(),这个我把这个构造函数加上去,结果他还是没有走到这里来。还有一个很神奇的地方,他并没有报函数调用不明确的错误。

当我使用这个对象的时候,很显然,_buffer是0,(nullptr), 但是_size却不是0,也不是BUFFER_SIZE = 1024 * 1024。

当你显式创建对象:CurlWriteData ddd;时,却是:error: call of overloaded ‘CurlWriteData()’ is ambiguous。


好了,那么我不用default吧。如下代码:

class TestA
{
public:
	TestA(){}
private:
	CurlWriteData _curl_wtire_data;
};


如果下面2个构造都存在:

CurlWriteData()
CurlWriteData(uint32_t buffer_size = BUFFER_SIZE)

那么这个时候,就会存在ambiguous问题,调用不明确。把无参构造函数删除即可解决。


就到这里,还在用default的朋友你知道这些 吗,希望给你提个醒,如果你也是这个问题,给个赞吧~!

顺便说下我的环境:

[xxx]# g++ --version
g++ (GCC) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


[xxx]# gcc --version
gcc (GCC) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

centos6.5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值