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++ ...
随机推荐
- WebRTC音视频引擎研究(2)--VoiceEngine音频编解码器数据结构以及参数设置
1.VoiceEngine Codec数据结构 WebRTC中,用一个结构体struct CodecInst表示特定的音频编解码器对象: struct CodecInst { int pltype; ...
- PowerShell:因为在此系统上禁止运行脚本
在安装chocolatey(官网)的时候,不能运行chocolateyInstall.pal脚本文件. 查阅资料后,得出如下解决办法: 首次在计算机上启动 Windows PowerShell 时,现 ...
- Hadoop学习笔记-008-CentOS_6.5_64_yum安装mysql
******************************卸载mysql***************************** 第一步,查看centos上是否已经安装了mysql数据库 # rp ...
- KB奇遇记(8):好人难做
题记:<KB奇遇记>已经更新到第八篇了.这一篇主要是讲项目实施过程中项目组成员之间的关系,也是我最不愿意回忆和讲述的事情. 早在来到KB公司的第一天开始,我就一直兢兢业业,丝毫不敢怠慢.面 ...
- uml视频系列(二)——uml的概述
在与uml进行了第一次的接触后,就被uml的博学多才给迷住了,uml居然可以做这么多的东西.才思敏捷的uml是设计软件的好帮手. 你还在为自己的类图不会设计而感到无助吗?你还在为你的对象不好确定而感到 ...
- 华为荣耀畅玩5C NEM-UL10 ROOT那些事儿(亲测成功)
以前ROOT手机都是在手机上安装KingRoot 刷机精灵等软件分分钟成功(不排除偶然,,比如这款华为荣耀...) 手机安装KingRoot等软件,,,失败 电脑上安装连接手机Root,,,,失败 ...
- docker - 容器里安装mysql
在docker中安装mysql ubuntu官方镜像是精简的ubuntu系统,很多软件和库没有安装,所以直接安装mysql的话依赖较多,建议直接从源码编译安装mysql 通过命令行安装 先启动一个容器 ...
- 爬虫:把廖雪峰的教程转换成 PDF 电子书
写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 ...
- 原生js实现轮播图
原生js实现轮播图 很多网站上都有轮播图,但找到一个系统讲解的却很难,因此这里做一个简单的介绍,希望大家都能有所收获,如果有哪些不正确的地方,希望大家可以指出. 原理: 将一些图片在一行中平铺,然后计 ...
- Java中显示图片的方法
最近在做一个swing小项目,其中需要把存储在硬盘中的图片文件显示出来,总结了如下方法: 1. Graphics g = getGraphics();String name = "E:/Ca ...