C++面试宝典 基本语言(三)

本文探讨了C++中函数重载的概念,解释了同时定义带const和不带const的函数是合法的,属于函数重载。此外,详细阐述了隐式类型转换的规则,包括内置类型提升和类类型通过构造函数的转换,并提醒了使用explicit关键字防止不必要的隐式转换。文章还介绍了C++中的类型转换,如reinterpret_cast、dynamic_cast、static_cast和const_cast的用途和注意事项。同时,讲解了new和malloc在内存分配上的区别,以及C++运行时类型识别(RTTI)的功能。最后,讨论了函数栈空间、externC在C++与C混合编程中的作用,以及new/delete与malloc/free的差异。

如果同时定义了两个函数,一个带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:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值