C++语法(学习记录)

1.构造函数

特点:没有返回值,可以有参数(因此可以重载),只会在创建对象时被调用一次,且无需手动调用,用于给成员变量初始化

2.析构函数

特点:没有返回值,也没有参数,不用写void,在名称前加上“~”,对象在销毁前会自动调用析构函数,用于释放占用的内存,防止内存泄漏

3.派生类的构造函数

在C++中,派生类(也称为子类)的构造函数需要处理两部分:一是它自己的成员初始化,二是基类的初始化

如果基类有非默认的构造函数(即需要参数的构造函数),那么派生类的构造函数必须显式地调用它。这可以通过初始化列表(member initializer list)来完成。如果基类有默认构造函数,则派生类的构造函数可以省略对基类构造函数的调用,因为编译器会自动调用它。

在派生类构造函数的初始化列表中,必须使用基类构造函数来初始化基类部分,因为基类的成员必须在派生类的成员之前初始化。

#include <iostream>  
  
// 基类  
class Base {  
public:  
    Base(int x) : baseValue(x) {}  
  
    void showBase() const {  
        std::cout << "Base value: " << baseValue << std::endl;  
    }  
  
protected:  
    int baseValue;  
};  
  
// 派生类  
class Derived : public Base {  
public:  
    // 派生类构造函数,同时接受基类构造函数的参数和派生类自己的参数  
    Derived(int x, int y) : Base(x), derivedValue(y) {}  
  
    void showDerived() const {  
        std::cout << "Derived value: " << derivedValue << std::endl;  
    }  
  
private:  
    int derivedValue;  
};  
  
int main() {  
    Derived d(10, 20);  
    d.showBase();    // 输出:Base value: 10  
    d.showDerived(); // 输出:Derived value: 20  
    return 0;  
}

4.创建对象时变量的初值

在C++11及以后的版本中,你可以在类定义时为非静态成员变量提供默认初始化器(default member initializer),但这并不是在“声明”时赋值,而是在创建类的实例时,如果没有为这些成员提供显式的初始化值,则使用这些默认初始化器。

class MyClass {  
public:  
    MyClass() {} // 构造函数  
  
    // ... 其他成员函数 ...  
  
private:  
    int myInt = 42; // 默认初始化器,在创建MyClass实例时如果没有初始化myInt,则它将被初始化为42  
    std::string myString = "Hello, World!"; // 同样,myString将被初始化为"Hello, World!"  
};

5.using 关键字

C++11 及其后续版本中的类型别名(Type Alias)语法, using 关键字来为一个类型创建一个新的名称

using uint32 = unsigned int;

6.非常量引用初值必须为左值

  • 左值:在C++中,左值可以出现在赋值语句的左边和右边。左值通常代表一个内存地址,通过这个地址我们可以读取和写入数据。例如,变量就是左值。
  • 右值:右值只能出现在赋值语句的右边,它通常是临时的、不可修改的数据。例如,常量或表达式的结果通常是右值。
  • 如果我们尝试用一个右值(如常量或表达式的结果)来初始化一个非常量引用,编译器会报错,因为右值通常不包含有效的内存地址,因此无法通过它来进行修改操作。

7.继承中析构函数的调用顺序

当派生类对象被销毁时,析构函数的调用顺序与构造函数相反,即首先调用派生类的析构函数,然后按照继承层次向上调用基类的析构函数。这是为了确保在派生类成员被销毁之前,基类部分的状态能够保持正确。

8.析构函数的回调

当你使用基类指针指向派生类对象,并试图通过该指针来删除该对象时(使用delete操作符),请确保基类的析构函数是虚函数,这是因为如果没有将基类的析构函数声明为虚函数,那么当使用基类指针删除派生类对象时,只会调用基类的析构函数,而不会调用派生类的析构函数。这会导致派生类对象中由new分配的资源不会被释放,从而产生资源泄漏。

9.虚函数

目的:为了实现多态,允许使用基类的指针或引用来调用派生类的函数,而无需在运行时确定实际调用的是哪个类的函数。

特点:被“virtual”修饰,析构函数一般是虚函数,因为在继承中,在delete时,线调用派生类的析构函数在调用基类的析构函数,如果基类的析构函数不是虚函数,那么只会调用基类的析构函数。

10.类中的静态变量和函数

在C++中,类的静态成员(包括静态变量和静态函数)是类的所有实例所共有的。这意味着静态成员不属于类的任何特定实例,而是与类本身相关联。

定义,静态变量在类中是使用static关键字声明的。它们不属于类的任何对象(或实例),而是属于类本身。静态变量在程序开始时分配内存,并在程序结束时释放。所有对象共享同一份静态变量的内存空间。
初始化,静态变量必须在类外部进行初始化。初始化通常在一个源文件中进行,并且只能进行一次。

静态函数只能访问静态成员(包括静态变量和其他静态函数),不能直接访问类的非静态成员。

11.纯虚函数

格式:纯虚函数在声明时,需要在函数声明的结尾处加上 = 0

// 纯虚函数声明  
    virtual void pureVirtualFunction() = 0;  

任何包含纯虚函数的类都是抽象类,抽象类不能被实例化(即不能创建抽象类的对象)。

如果派生类没有为所有纯虚函数提供实现,那么它也将成为抽象类。

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值