首页 > 编程语言 >C++练习题

C++练习题

时间:2023-06-18 22:44:37浏览次数:46  
标签:练习题 函数 C++ class Base 派生类 include public

多态

判断

  • Q1: 虚函数可以是内联的?
    A1: 错误。内联是编译时刻决定的,虚函数是运行时刻动态决定的,所以虚函数不能是内联函数。虚函数前加上inline不会报错,但是会被忽略。

  • Q2: 一个类内部,可以同时声明 static void fun()virutal void fun() 两个函数?
    A2: 错误。虽然静态函数不存在this指针,但是还是不能声明同参的虚函数和静态函数。

  • Q3: 基类的析构函数非虚,派生类的析构函数是虚函数。delete派生类指针(指向派生类对象)会调用基类析构函数?
    A3: 正确。

    通过派生类指针,删除派生类对象时,无论父类析构函数是不是虚函数,都会调用基类析构函数。

    通过基类指针,删除派生类对象时,是否调用基类析构函数,取决于基类析构函数是否是virtual函数

知识点

可以通过对象名主动调用析构函数,主动调用构造函数会出错。

如果类中声明了构造函数(无论是否有参数),编译器便不会再为之生成隐含的构造函数。

构造函数不能是虚函数,析构函数可以是虚函数。

编程

析构函数需要声明为virtual

#include <iostream>
using namespace std;

int g_num = 0;

class Base
{
public:
    Base() {}
    ~Base() { g_num += 1; }
};

class Derived:public Base
{
public:
    Derived() {}
    ~Derived() { g_num += 2; }
};

int main()
{
    Base *p = new Derived();
    delete p;
    cout << g_num << endl;
    return 0;
}
// 输出:1

动态绑定依赖于指针或者引用

#include <iostream>
using namespace std;

class Base
{
public:
    virtual void fun() {cout << "base" << endl;}
};

class Derived:public Base
{
public:
    virtual void fun() { cout << "derived" << endl;}
};

void func1(Base &obj) {
    obj.fun();
}
void func2(Base obj) {
    obj.fun();
}

int main()
{
    Base *pBase = new Derived();
    func1(*pBase); // derived
    func2(*pBase); // base
    return 0;
}

operator可以定义为虚函数

#include <iostream>
using namespace std;

class Base
{
public:
    virtual void operator == (int val2) {
        cout << "base: " << val2 << endl;
    }
};

class Derived:public Base
{
public:
    virtual void operator == (int val2) {
        cout << "derived: " << val2 << endl;
    }
};

int main()
{
    Base *pBase = new Derived();
    Derived *pDerived = new Derived();
    *pBase == 10;
    *pDerived == 20;
}

// derived: 10
// derived: 20

绝不重新定义继承而来的缺省参数

#include <iostream>
using namespace std;

class Base
{
public:
    virtual void fun(string str = "base123") {
        cout << str << endl;
    }
};

class Derived:public Base
{
public:
    virtual void fun(string str = "derived") {
        cout << str << endl;
    }
};

int main()
{
    Base *pBase = new Derived();
    pBase->fun(); // base123
}

同名const函数属于有效重载

#include <iostream>
using namespace std;

class Base
{
public:
    void func1() {cout << "non-const\n";}
    void func1() const {cout << "const\n";}
};

int main()
{
    Base b1;
    b1.func1(); // non-const。非常量对象也可以调用const函数,此处优先调用non-const函数

    const Base b2;
    b2.func1(); // const。常量对象只能调用const函数
}

virtual函数的const必须统一

#include <iostream>
using namespace std;

class Base
{
public:
    virtual void display() const { cout << "Base"; }
};

class Derived:public Base
{
public:
    virtual void display() { cout << "Derived"; }
};

int main()
{
    Base *pBase = new Derived();
    pBase->display(); // Base
}

派生类生成过程

派生类构造函数执行顺序:

1.调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)

2.对派生类新增的成员对象初始化,调用顺序按照它们在类中声明的顺序

3.执行派生类的构造函数体中的内容。

#include <iostream>
#include <string>
using namespace std;

class A {
public:
    A(string name) {cout << name << " ";}
};

class Base {
public:
    Base(string str) : a1(str) {}
public:
    A a1;
};

class Derived : public Base {
public:
    Derived() : a4("a4"), Base("a1"), a2("a2") {}
public:
    A a2;
    A a3 = A("a3");
    A a4;
};

int main()
{
    Derived d;
    return 0;
}
// 输出:a1 a2 a3 a4
#include <iostream>
#include <string>
using namespace std;

class Base {
public:
    Base(int val) : a(val) {}
protected:
    int a;
};

class Derived : public Base {
public:
    Derived(int val1, int val2) : c(val2), Base(val1), b(a + c) {
        cout << a << " " << b << " " << c << endl; // a==1, b的值不确定, c==10
    }
private:
    int b;
    int c;
};

int main()
{
    Derived d(1, 10);
}

标签:练习题,函数,C++,class,Base,派生类,include,public
From: https://www.cnblogs.com/devin1024/p/17489927.html

相关文章

  • C++面试八股文:什么是RAII?
    C++面试八股文:什么是RAII?某日二师兄参加XXX科技公司的C++工程师开发岗位第13面:面试官:什么是RAII?二师兄:RAII是ResourceAcquisitionIsInitialization的缩写。翻译成中文是资源获取即初始化。面试官:RAII有什么特点和优势?二师兄:主要的特点是,在对象初始化时获取资源,在对......
  • C++基础知识总结
    2023/6/18本篇章记录学习过程C++的基础概念和代码测试实现,还有很多需要补充。一是还不清楚,二是还没有学到。打算学习过程中后面再做补充。先看完《C++primer》书之后再慢慢来添加补充1.函数重载一个函数名可以实现多个功能,这取决于函数参数不同来实现判断对应的功能,与返回......
  • C++面试八股文:std::string是如何实现的?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第18面:面试官:std::string用过吧?二师兄:当然用过(废话,C++程序员就没有没用过std::string的)。面试官:std::string("hello")+"world"、"hello"+std::string("world")和std::string("hello")+std::string("world")的......
  • C++面试八股文:std::string是如何实现的?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第18面:面试官:std::string用过吧?二师兄:当然用过(废话,C++程序员就没有没用过std::string的)。面试官:std::string("hello")+"world"、"hello"+std::string("world")和std::string("hello")+std::string("world")的......
  • C++构造函数
    RAIIResourceAcquisitionIsInitialization,资源获取即初始化这是一种解决资源管理问题的方法,将资源的有效期与持有资源的对象的生命期严格绑定,由对象的构造函数完成资源的分配,由析构函数完成资源的释放C++借助构造函数和析构函数,解决了传统的malloc&free和new&de......
  • C++创建对象的4种方式对比
    三种方式分别为等号,圆括号,大括号,最后一种是等号和大括号一起使用等号和圆括号是以前就存在的,大括号是新的语法,其具有2个优点:防止变窄转换:大括号不支持变窄转换,等号和圆括号为了向下兼容支持变窄转换免疫C++最令人头疼的解析:C++规定任何可以被解析为一个声明的东西必......
  • Python和C++之间的主要区别点?
    Python和C++之间的区别可以简洁地概括如下:编程范式:Python是一种解释型、面向对象的动态语言,更注重代码的简洁性和可读性,适合快速开发和原型设计。C++是一种编译型、多范式语言,支持面向对象、过程式和泛型编程,更注重底层的控制和性能优化。语法复杂性:C++具有较为复杂的语法和......
  • C++家谱管理系统[2023-06-18]
    C++家谱管理系统[2023-06-18]小组项目二实验题目:家谱管理系统实验目的:1、掌握树以及二叉树的定义;2、掌握树以及二叉树的基本操作,如建立、查找、插入和删除等。实验要求:小组合作方式,共同讨论完成该任务。实验内容:家谱管理系统是查询家谱信息必不可少的一部分,利用家谱管理系......
  • 【详解C++中的引用】
    @TOC一、什么是引用引用就是给一个变量取别名。注意:这个引用不会新开辟一块空间,而是和原来的变量公用一块空间。举个例子:李逵,在家称为"铁牛",江湖上人称"黑旋风"。二、引用规则引用规则:引用实体类型+&+引用别名=引用实体。比如下面:intmain(){ inta=10; //引用 int&ba=a......
  • Licensecc-C++ License Manager
    [email protected] Licensecc:aC++softwarelicensemanager。使用Licensecc可以给开发的软件加上保护,限制软件的使用。通过授权控制来限制软件的使用,也可以限制软件的使用时间,及限制软件在指定机器上运行。Licensecc是基于BSD协议开源的软件授权......