如果同时定义了两个函数,一个带const,一个不带,会有问题吗?
#include<iostream>
class A{
public:
void print()const{
std::cout << "Hello" << std::endl;
}
void print(){
std::cout << "World" << std::endl;
}
};
int main(){
A a{};
const A const_a;
a.print();
const_a.print();
return 0;
}
请你来说一说隐式类型转换
- 首先,对于内置类型,低精度的变量给高精度变量赋值会发生隐式类型转换, int -> double
- 其次,对于只存在单个参数的构造函数的对象构造来说,函数调用可以直接使用该参数传入,编译器会自动调用其构造函数生成临时对象
注意事项
- “可以用单个形参进行调用” 并不是指构造函数只能有一个形参,而是它可以有多个形参,但那些形参都是有默认实参的。 那么,什么是“隐式转换”呢? 上面这句话也说了,是从 构造函数形参类型 到 该类类型 的一个编译器的自动转换。
- 代码中可以看到,isSameISBN函数是期待一个BOOK类类型形参的,但我们却传递了一个string类型的给它,这不是它想要的啊!还好,BOOK类中有个构造函数,它使用一个string类型实参进行调用,编译器调用了这个构造函数,隐式地将stirng类型转换为BOOK类型(构造了一个BOOK临时对象),再传递给isSameISBN函数。 隐式类类型转换还是会带来风险的,正如上面标记,隐式转换得到类的临时变量,完成操作后就消失了,我们构造了一个完成测试后被丢弃的对象。 我们可以通过explicit声明来抑制这种转换:
- explicit BOOK(string ISBN,float price=0.0f):_bookISBN(ISBN),_price(price){}
- explicit关键字只能用于类内部的构造函数声明上.这样一来,BOOK类构造函数就不能用于隐式地创造对象了
- 可以使用一个实参进行调用,不是指构造函数只能有一个形参。 隐式类类型转换容易引起错误,除非你有明确理由使用隐式类类型转换,否则,将可以用一个实参进行调用的构造函数都声明为explicit。
- explicit只能用于类内部构造函数的声明。它虽然能避免隐式类型转换带来的问题,但需要用户能够显式创建临时对象(对用户提出了要求)。
#include <string>
#include <iostream>
using namespace std ;
class BOOK //定义了一个书类
{
private:
string _bookISBN ; //书的ISBN号
float _price ; //书的价格
public: