c++ 构造函数以及explicit 关键字的使用
关于构造函数中的隐式转换:
在一个类所定义的构造函数中,存在如下的用法:
#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 关键字的使用的更多相关文章
- explicit关键字
C++中,explicit关键字用来修饰类只有一个参数的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使用注意事项: explicit 关 ...
- 透过一个实例理解C++语言的explicit关键字
我们先看一段代码: 建立people.cpp 文件,然后输入下列内容:class People{ public: int age; explicit People (in ...
- C++ 构造函数放置默认转换explicit关键字(2)
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p ); ...
- 从零开始学C++之构造函数与析构函数(一):构造函数、析构函数、赋值与初始化、explicit关键字
一.构造函数.默认构造函数 (1).构造函数 构造函数是特殊的成员函数 创建类类型的新对象,系统自动会调用构造函数 构造函数是为了保证对象的每个数据成员都被正确初始化 函数名和类名完全相同 不能定义构 ...
- C++的拷贝构造函数、operator=运算符重载,深拷贝和浅拷贝、explicit关键字
原文地址:https://blog.csdn.net/shine_journey/article/details/53081523 1.在C++编码过程中,类的创建十分频繁. 简单的功能,当然不用考虑 ...
- 构造函数、析构函数、赋值与初始化、explicit关键字
一.构造函数.默认构造函数 (1).构造函数 构造函数是特殊的成员函数 创建类类型的新对象,系统自动会调用构造函数 构造函数是为了保证对象的每个数据成员都被正确初始化 函数名和类名完全相同 不能定义构 ...
- C++ explicit关键字,修饰构造函数,ctor
#include <iostream> // operator Type() 类型操作符重载 // operator int() // operator double() // ... / ...
- C++ explicit关键字详解
本文系转载,原文链接:http://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用 ...
- C++中explicit关键字的使用
看书看到了explicit关键字,就来做个笔记,讲得比较明白,比较浅. 在C++中,我们有时可以将构造函数用作自动类型转换函数.但这种自动特性并非总是合乎要求的,有时会导致意外的类型转换,因此,C++ ...
随机推荐
- IOS获取经度纬度
仔细研究了一下SDK文档,再结合网上的方法,写了这一个简单的获取经纬度的方法,大家看看就好. 首先要导入CoreLocation.Frame 包 .h 文件 1 2 3 4 5 6 7 8 9 #im ...
- We Chall-Training: Encodings I -Writeup
MarkdownPad Document html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,ab ...
- webpack入门+react环境配置
小结放在前:这篇文章主要是为下一篇的react提前铺好路,webpack是一个前端资源模块化管理和打包工具,说白了就是方便我们管理自己的常用的一些代码,比如你开发中用到sass以及jade同时用到es ...
- 初识XMLHttpRequeset
XMLHttpRequeset是什么 XmlHttpRequest,可扩展的超文本传输歇息.从字面上理解:xml,可扩展的标记语言:http,超文本传送协议:request,请求.XmlHttpReq ...
- iOS 启动页后广告Demo
重点! 对于启动页后的广告,相信大家也都看到过很多很多的,比如我自己常看到的有 QQ音乐,爱奇艺了.你点击了APP,它会启动就会随之启动..其实这些APP的启动页是没有消失的,你去认真的观察一下!所以 ...
- 使用nat方式解决虚拟机联网问题
本文全文参考:http://jingyan.baidu.com/album/4e5b3e1957979d91901e24f1.html?picindex=1,谢谢 对于很多的linux初学者来说,最开 ...
- 【Zookeeper】源码分析之请求处理链(一)
一.前言 前面已经分析了Watcher机制的主要代码,现在接着分析Zookeeper中的请求处理链,其是Zookeeper的主要特点之一. 二.总体框图 对于请求处理链而言,所有请求处理器的父接口为R ...
- kali linux live(persistence)+PE+windows7安装多启动菜单优盘制作
需要以下工具: 下载链接: 一.制作kali linux persistence 将32GU盘格式化为FAT32格式,使用win32diskimager将kalilinux镜像写入优盘,占用优盘3.4 ...
- DNS详解
许多应用层软件经常直接使用域名系统 DNS (Domain Name System),但计算机的用户只是间接而不是直接使用域名系统. 因特网采用层次结构的命名树作为主机的名字,并使用分布式的域名系统 ...
- java为移动端写接口
java作为一门后端语言,其厉害之处在于web,大家比较熟知的各种网络应用,java都能做,那么在这个移动优先的时代,如何继续发挥java的强大呢.通常是让java作为一个app的服务端,为app客户 ...