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++ ...
随机推荐
- JavaWeb学习篇之----HTTP协议详解
简介: HTTP是hypertexttransfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程. HTTP协 ...
- 源码(04) -- java.util.List<E>
java.util.List<E> 源码分析(JDK1.7) --------------------------------------------------------------- ...
- localStorage 如何存储JSON数据并读取JSON数据
localStorage是HTML5提供的再客户端实现本地存储的一种方法,但是localStorage方法只能存储字符串数据,有时候我们需要存储对象到本地比如:JSON:那么,localStorage ...
- UINavigationController实现全屏滑动返回功能
说明: UINavigationController默认在push出的控制器中都有边沿滑动返回功能,但是只能从屏幕左边滑才能返回,若从屏幕中间画并没有效果.下面实现全屏滑动功能. 探究: 系统默认能够 ...
- 最简单的排序算法之一冒泡排序----js实现
1. 算法步骤 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数. 针对所有的元素重复以上的步骤, ...
- Android注解学习(2)
最近考试周没什么时间写,回归正题.前面的一次简单的讲了关于注解的的基础部分,这一次分析xutils注解封装的源码(奉上github源码). 补充下:xUtils 2.x对Android 6.0兼容不是 ...
- websevice(Web服务)基础
webservice简介: 1.WebService到底是什么? WebService是一种跨编程语言和跨操作系统平台的远程调用技术.所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户 ...
- 谈谈JavaScript代码混淆
概述: 案例:Cesium打包流程,相关技术点和大概流程 原理:代码优化的意义:压缩 优化 混淆 优化:如何完善Cesium打包流程 关键字:Cesium gulp uglifyjs 字数:2330 ...
- 对Unity注入技术最简单的理解和应用
Unity注入技术,我决定最大的作用在于一个项目,尤其是WEB项目在更远其中一个类时,不需要重新生成,直接通过WEBCONFIG文件的修改就可以更改对应关系和功能,实验步骤如下: 1:新建一个接口IS ...
- HttpClient请求详解
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建 ...