<一> 

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. python装饰器-如何更通俗地讲解Python的装饰器?
  2. mysql编辑前200行_巧妙使用SQL Server编辑前200行功能
  3. JAVA经典题--死锁案例
  4. 安卓checkbox无响应_【安卓手机】无法连接电脑的解决方法
  5. Win7系统转到Win10系统的装机方法
  6. 人工智能离前端并不远 一步步教你开发一个机器学习APP(附源码)
  7. 设计模式学习笔记(十八:模板方法模式)
  8. zookeeper 3.5.6安装
  9. JdbcUtils针对事务问题作出的第三次修改
  10. 3D屏保:魔方2.0版本
  11. python 等差素数列
  12. 转:gp88写频教程
  13. python双色球数据抓取及模拟生成高概率的号码
  14. css旋转45度_Matplotlib中的文字旋转问题
  15. java导出pdf 含图片_【Java】itext根据模板生成pdf(包括图片和表格)
  16. m基于LS+变步长LMS的Volterra级数数字预失真DPD系统matlab仿真
  17. 使用fiddler实现手机抓包
  18. 那些实用的 Chrome 扩展神器(二)
  19. 今天过了淘宝商城的考试,嘿做点好事,公布些答案
  20. Celery介绍——手机短信异步发送

热门文章

  1. 关于ABAP中P类型的理解
  2. 微信测试账号(验证成为开发者)总是配置失败
  3. 我把毕业设计命名成“垃圾”发给了导师...
  4. 如何快速上手新项目?
  5. JavaWeb第一天--前端技术
  6. vue-code-diff内容过长时需要拉到底才能显示横向滚动条(滚动条不管内容长短都要让它显示,还要同步滚动)
  7. LeetCode 257 Binary Tree Paths
  8. gam估计模型的链接
  9. 第一节课 面向对象程序设计——认识对象
  10. clk为什么要用posedge,而不用negedge