关于构造函数中的隐式转换:

在一个类所定义的构造函数中,存在如下的用法:

 #pragma once
#ifndef __EXERCISE__
#define __EXERCISE__ #include <string> class Sale_Item
{
public:
Sale_Item(const std::string&);
Sale_Item(std::istream&);
Sale_Item();
void print();
bool isSame(Sale_Item);
static int total;
private:
std::string number;
}; #endif // !__EXERCISE__

这里定义了一个Sales_Item类,其中构造函数可以传入iostream或者是string对象。还有一个成员函数是传入一个Sales_Item对象来作为两个Sales_Item对象的比较。那么我们在调用isSame(Sales_Item) 方法时,其实是可以传入一个string对象来进行实现的。

因为这里会默认进行类型转换,转换的方式就是将这个实参字符串通过构造函数(传入string对象的构造函数) 转换成Sales_Item对象。见如下代码使用:

 // ConsoleApplication18.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "Exercise.h"
#include <iostream> using namespace std; Sale_Item::Sale_Item()
{
number = "default";
++total;
} Sale_Item::Sale_Item(const string &str)
{
number = str;
++total;
} Sale_Item::Sale_Item(istream &is)
{
is >> number;
++total;
} void Sale_Item::print()
{
cout << number << endl;
} bool Sale_Item::isSame(Sale_Item item)
{
return this->number == item.number;
}
int Sale_Item::total = ; int main()
{
Sale_Item temp("");
temp.print();
string number = "";
cout << temp.isSame(number) << endl;
cout << "the number of object is : " << temp.total << endl;
system("PAUSE");
return ;
}

这里就将isSame的参数进行隐式转换了。

如果不想这种隐式转换自动进行,那么可以将这个传入string对象的构造函数声明为explicit 。

static 字段说明:

还有一种要记录,就是关于static 字段的说明。static 成员是类的成员,不仅仅要进行声明,而且在定义该类的cpp文件中还要进行一次初始化,还是上面的代码,cpp 文件中初始化了total变量,这里我使用total变量的作用是统计一共产生了多少个Sales_Item对象。

类的声明中包含该类的数据成员:

在一个类,如果需要定义一个该类类型的字段,那么这个字段必须是指针或者引用。因为这个时候,类的定义是不完整的。

关于构造函数的初始化列表:

一般情况下,建议使用构造函数初始化列表的方式来初始化成员变量。Sales_Item构造函数可以做如下修改:

 Sale_Item::Sale_Item(const string &str) :number(str)
{
++total;
}

一般情况下,都建议使用初始化列表来进行初始化,变量的初始化分为两个过程,第一是初始化,第二是赋值。建议使用初始化列表的方式,其原因在于有些成员变量没有默认的构造函数,或者是const类型的成员。

c++ 构造函数以及explicit 关键字的使用的更多相关文章

  1. explicit关键字

    C++中,explicit关键字用来修饰类只有一个参数的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使用注意事项: explicit 关 ...

  2. 透过一个实例理解C++语言的explicit关键字

    我们先看一段代码:    建立people.cpp 文件,然后输入下列内容:class People{    public:      int age;     explicit People (in ...

  3. C++ 构造函数放置默认转换explicit关键字(2)

    按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p );  ...

  4. 从零开始学C++之构造函数与析构函数(一):构造函数、析构函数、赋值与初始化、explicit关键字

    一.构造函数.默认构造函数 (1).构造函数 构造函数是特殊的成员函数 创建类类型的新对象,系统自动会调用构造函数 构造函数是为了保证对象的每个数据成员都被正确初始化 函数名和类名完全相同 不能定义构 ...

  5. C++的拷贝构造函数、operator=运算符重载,深拷贝和浅拷贝、explicit关键字

    原文地址:https://blog.csdn.net/shine_journey/article/details/53081523 1.在C++编码过程中,类的创建十分频繁. 简单的功能,当然不用考虑 ...

  6. 构造函数、析构函数、赋值与初始化、explicit关键字

    一.构造函数.默认构造函数 (1).构造函数 构造函数是特殊的成员函数 创建类类型的新对象,系统自动会调用构造函数 构造函数是为了保证对象的每个数据成员都被正确初始化 函数名和类名完全相同 不能定义构 ...

  7. C++ explicit关键字,修饰构造函数,ctor

    #include <iostream> // operator Type() 类型操作符重载 // operator int() // operator double() // ... / ...

  8. C++ explicit关键字详解

    本文系转载,原文链接:http://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用 ...

  9. C++中explicit关键字的使用

    看书看到了explicit关键字,就来做个笔记,讲得比较明白,比较浅. 在C++中,我们有时可以将构造函数用作自动类型转换函数.但这种自动特性并非总是合乎要求的,有时会导致意外的类型转换,因此,C++ ...

随机推荐

  1. 在Winfrom下实现类似百度、Google搜索自能提示功能

    前记:数据源来自页面的一个ComboBox的数据源List<Contract>集合 页面放置一个TextBox(搜索框).ListBox(显示搜索出来的数据),ListBox位置位于Tex ...

  2. Node.js理解

    JavaScript单线程的误解 在我接触JavaScript(无论浏览器还是NodeJS)的时间里,总是遇到有朋友有多线程的需求.而在NodeJS方面,有朋友甚至直接说到,NodeJS是单线程的,无 ...

  3. Android自定义控件系列(四)—底部菜单(下)

    转载请注明出处:http://www.cnblogs.com/landptf/p/6290862.html 在app中经常会用到底部菜单的控件,每次都需要写好多代码,今天我们用到了前几篇博客里的控件来 ...

  4. python enhanced generator - coroutine

    本文主要介绍python中Enhanced generator即coroutine相关内容,包括基本语法.使用场景.注意事项,以及与其他语言协程实现的异同. enhanced generator 在上 ...

  5. php中 0 与 字符串比较的问题

    今天我的技术群里,被一个很不起眼的问题炸出很多基础不稳的phper,就是这么一句 : <?php if(0 == 'yes'){ echo 'yes'; }else{ echo 'no'; } ...

  6. Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.由于数字图像的离散信号, ...

  7. 设置npm安装模块目录<nodejs>

    nodejs安装模块命令: npm install <input_name> # 本地安装 npm install <input_name> -g # 全局安装 1.npm i ...

  8. 开放才能进步!Angular和Wijmo一起走过的日子

    Angular 已成为广受欢迎的前端框架.去年9月份,期待已久的 Angular2 的正式版发布之后,Angular 又迎来了新一轮热潮.伴随着 Angular 这一路走来,Wijmo 一直都是第一个 ...

  9. PAT乙级 1065. 单身狗(25) by Python

    1065. 单身狗(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue "单身狗"是中文对 ...

  10. GAME(A)性能测试过程模型