C++面经

C++中的extern关键字

extern是c++引入的一个关键字,它可以应用于一个全局变量,函数或模板声明,说明该符号具有外部链接(external linkage)属性。
什么是声明?
在程序中变量可以声明多次,但只能定义一次。一般而言,定义就是声明。但C++中由于extern的缘故,变量的声明和定义是可以分开的。凡是没有带extern的声明同时也都是定义(对于变量而言)。而对函数而言,带有{}是定义,否则是声明。如果想声明一个变量而非定义它,就在变量名前添加关键字extern,且不要显式的初始化变量。

extern “C” 和extern “C++”函数声明

在C++中,当与字符串连用时,extern指明当前声明使用了其他语言的链接规范,如extern "C",就指明使用C语言的链接规范。原因是,C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时无法找到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。C和C++对函数的处理方式是不同的。extern "C"是使C++能够调用C的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern “C”来说明。

如何让类对象只在栈(堆)上分配空间

  1. 只在堆上分配类对象

    编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。
    或者单例模式也可以实现。

    1
    2
    3
    4
    5
    6
    7
    class A {
    public:
    A() {}
    void destory() { delete this; }
    private:
    ~A() {}
    };
  2. 只在栈上分配空间

    只要禁用new运算符就能够实现类对象只能创建在栈上。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class A  
    {
    private:
    void* operator new(size_t t){}
    void operator delete(void* ptr){}
    public:
    A(){}
    ~A(){}
    };

C++哪些运算符不能被重载

  1. .(成员访问运算符)
  2. ->(指针访问运算符)
  3. ::(域运算符)
  4. sizeof(长度运算符)
  5. ?:(条件运算符)

C++如何防止对象被拷贝

最容易想到的是将拷贝构造函数与赋值函数声明为private。但是,private只是说外部不能直接调用,但是可以间接通过类的成员函数与友元函数对其访问。
为了禁止拷贝对象,我们只需要让其私有继承自boost::noncopyable。
或者删除这两个函数= delete


C++面经
http://example.com/2024/08/24/C语言编程拾遗/C++/C++面经/
作者
LiuZhaocheng
发布于
2024年8月24日
许可协议