<一> 

class Stock
{
private:string _company;long _share;double  _val;
};

C++提供了两种使用构造函数来初始化对象的方法。第一种是显式的调用构造函数:

Stock food = Stock("hello",12,20.5);

这将food对象的_company成员设置为字符串"hello",将_share成员设置为12,以此类推。

另一种是隐式地调用构造函数:

Stock garment("world",13,2.5);

这种调用更紧凑,它与下面的显示调用等价:

Stock garment = Stock("world",13,2.5);

每次创建类对象(甚至使用new动态分配内存)时,C++都使用类构造函数。下面是将构造函数与new一起使用的方法:

Stock *pstock =  new Stock("google",15,22.5);

这条语句创建了一个Stock对象,将其初始化为参数提供的值,并将该对象的地址赋给pstock指针。在这种情况下,对象没有名称,但是可以使用指针来管理该对象。

构造函数的使用不同于其他类方法。一般来说,使用对象来调用方法:

stock1.show();

但无法使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的。因此构造函数被用来创建对象,而不能同过对象来调用。

<二>

class A
{
};

如果在编写类时没有显示的写出其构造函数,拷贝构造函数,析构函数,以及重载赋值操作符,编译器会在编译代码时,会为该类加上这些。

其形式大致如下:

class A
{A(){}A& operator =(const A& a){memcpy(this, &a, sizeof(A));  //此处可能用问题,仅为表明不是浅拷贝return *this;}A(const A& a){*this = a; //调用了赋值重载函数}~A() // 注意在析构函数前不会加上virtual关键字{}
};

下面给出一些示例,注释部分说明了函数调用的情况:

void f()
{A a;     // A()构造函数被调用A b(a);  // A(const A& a)构造函数被调用 A c = a; // A(const A& a)构造函数被调用 b = c;   // A& operator = (const A& a)赋值操作符重载函数被调用
}// 离开f()函数之前,a,b,c的析构函数被调用,释放资源
A c = a;

这句代码实际调用的是拷贝构造函数,而非赋值函数。

因此,我们可以构造出这样的代码。


class A
{
private:int *m_data;std::string ss;
public:A(){m_data = NULL;}A(int n){m_data = NULL;if (n>0)m_data = new int[n];}A& operator =(const A& a){memcpy(this, &a, sizeof(A));return *this;}virtual ~A(){if (NULL!=m_data){delete [] m_data;m_data = NULL;}}
};
int main()
{A a = 3; // 将整数3赋值给一个对象return 0;
}

将整数3赋值给一个A类型对象a,然而以上代码可以编译通过。 -- 有点不合常理

这是由于“单参数构造函数”被自动型别转换(这是一个隐式转换)。

可以通过explicit关键字,阻止“以赋值语法进行带有转型操作的初始化”。如下所示:


class A
{
private:int *m_data;std::string ss;
public:A(){m_data = NULL;}explicit A(int n){m_data = NULL;if (n>0)m_data = new int[n];}A& operator =(const A& a){memcpy(this, &a, sizeof(A));return *this;}virtual ~A(){if (NULL!=m_data){delete [] m_data;m_data = NULL;}}};
int main()
{// A a = 3; // 编译无法通过A b(3); // 可以编译通过return 0;
}

C++隐式构造与显式构造相关推荐

  1. js 中的this,默认绑定、隐式绑定、显式绑定、new绑定、箭头函数绑定详解

    壹 ❀ 引 工具猴-免费在线工具-在线工具箱- 可以说this与闭包.原型链一样,属于JavaScript开发中老生常谈的问题了,百度一搜,this相关的文章铺天盖地.可开发好几年,被几道this题安 ...

  2. 五种绑定彻底弄懂this,默认绑定、隐式绑定、显式绑定、new绑定、箭头函数绑定详解

    壹 ❀ 引 可以说this与闭包.原型链一样,属于JavaScript开发中老生常谈的问题了,但开发好几年,依然被几道this指向题安排明明白白的人应该不在少数.对于初学者而言,this概念抽象,变化 ...

  3. Oracle隐式游标和显式游标

    游标是什么?就是在内存开辟的一块临时存储空间. 1.Oracle隐式游标 1.1Oracle有常用的哪些隐式游标 1.2 Oracle隐式游标演示 -- 隐式游标 (使用的表为Oracle默认自带的e ...

  4. intent隐式和显式_Neo4j:使隐式关系成为显式和双向关系

    intent隐式和显式 我最近阅读了Michal Bachman关于 Neo4j中双向关系的文章 ,他建议对于某些关系类型,我们对关系的方向不那么感兴趣,因此可以在查询时忽略它. 他使用以下示例显示N ...

  5. Neo4j:使隐式关系成为显式和双向关系

    最近,我阅读了Michal Bachman关于 Neo4j中双向关系的文章 ,他建议对于某些关系类型,我们对关系的方向不那么感兴趣,因此可以在查询时忽略它. 他使用以下示例显示了Neo Technol ...

  6. oracle 游标内存自动释放,详解Oracle隐式游标和显式游标

    游标是什么?就是在内存开辟的一块临时存储空间. 1.Oracle隐式游标 1.1Oracle有常用的哪些隐式游标 1.2 Oracle隐式游标演示 -- 隐式游标 (使用的表为Oracle默认自带的e ...

  7. Selenium中的隐式等待和显式等待

    在Selenium中,"等待"在执行测试中起着重要作用.在本文中,您将学习Selenium中"隐式"和"显式"等待的各个方面. 在本文中,您 ...

  8. Python网络爬虫Selenium页面等待:强制等待、隐式等待和显式等待

    关于Python网络爬虫Selenium强制等待.隐式等待和显式等待的总结 from selenium import webdriver import time from selenium.webdr ...

  9. Selenium4+Python3系列 - Selenium的三种等待,强制等待、隐式等待、显式等待

    为什么要设置元素等待 直白点说,怕报错,哈哈哈! 肯定有人会说,这也有点太直白了吧. 用一句通俗易懂的话就是:等待元素已被加载完全之后,再去定位该元素,就不会出现定位失败的报错了. 如何避免元素未加载 ...

  10. 自动化测试中,三种常用的等待方式,强制式(sleep) 、 隐式 ( implicitly_wait ) 、显式(expected_conditions)

       在自动化测试总,主要有三种常用的等待方式,强制式(sleep) . 隐式 ( implicitly_wait ) .显式(expected_conditions). 一.强制式(sleep)   ...

最新文章

  1. 获取预制和获取gameObject
  2. 计算机网络考试有感 2019 山东大学
  3. 面试题4:二维数组中的查找
  4. 深入解读EOS源代码之——区块链内核
  5. SpringBoot之静态资源访问
  6. python-scrapy爬虫框架
  7. 在osx 10.10.3 下安装git总结
  8. Linux下10 个最酷的 Linux 单行命令(转载)
  9. ALV 行、列、单元格颜色设置
  10. css选择器总结(内附实例及截图)
  11. 【输入法】五笔学习系列教程
  12. java算法面试题及答案pdf,中信银行Java笔试题库
  13. Windows API笔记(六)内存映射文件
  14. 华为29岁程序员哀叹:年薪50万,4年攒100万,对未来很迷茫!
  15. 台式电脑主板插线步骤图_图解台式电脑电源与主板对接安装详细过程。
  16. 多组两两比较用什么检验方法_SPSS教程:多个组比较(Fisher精确检验)及组间两两比较...
  17. windows删除桌面右键“英特尔@显卡设置”
  18. 肝了一宿才收集的48个超炫酷的 CSS 文字特效,绝对值得收藏!!!
  19. CSS教程:dashed和dotted的区别
  20. 安装 win7虚拟机

热门文章

  1. 用stm32f103zet6产生6路pwm控制舵机
  2. 200 行代码实现一个简单的区块链应用1
  3. phonegap3.4.0如何安装
  4. c#方法参数:params
  5. Free as in beer VS Free as in speech
  6. 神奇的 new Exception()
  7. Java 获取文件大小
  8. 这名“业余”程序员,曾用50张1080Ti对抗癌症!!!
  9. C#中检查IP地址格式(亲测有用)
  10. 快递查询小程序的源码分享 源码仅供参考