C++的基础语法

179 阅读4分钟

C++兼容C语法。程序代码的组成是由变量/常量 与操作符组成的. 变量是由变量类型进行定义.

变量类型

基本变量

int 
long 
unsigned 
int 
char 
boolean

可以通过typedef 进行类型的别名定义 typedef int MyInt

函数指针

返回类型 (*指针变量名)(参数列表)

定义函数指针

typedef void (*Myfunc) (int)

# 或者使用using定义
using Myfunc = void (*)(int)

操作符

1. 算术操作符

+ : 加法 - : 减法 * : 乘法 / : 除法 % : 取余

2. 关系操作符

== : 等于 != : 不等于 > : 大于 < : 小于 >= : 大于等于 <= : 小于等于

3. 逻辑操作符

&& : 逻辑与 || : 逻辑或 ! : 逻辑非

4. 位操作符

& : 位与 | : 位或 ^ : 位异或 ~ : 位取反 << : 左移 >> : 右移

5. 赋值操作符

= : 赋值 += : 加赋值 -= : 减赋值 *= : 乘赋值 /= : 除赋值 %= : 余赋值 &= : 位与赋值 |= : 位或赋值 ^= : 位异或赋值 <<= : 左移赋值 >>= : 右移赋值

6. 自增和自减操作符

++ : 自增-- : 自减

7. 条件操作符

?: : 三元操作符

8. 成员访问操作符

. : 成员访问-> : 指针成员访问

9. 类型转换操作符

static_cast<type> : 静态类型转换 dynamic_cast: 动态类型转换const_cast: 常量类型转换reinterpret_cast` : 重新解释类型转换

10. 其他操作符

sizeof : 获取类型或变量的大小 typeid : 获取类型信息 , : 逗号操作符

11 操作符自定义

class Vector {
public:
    Vector operator+(const Vector& other) const;
    // ...
};

Vector Vector::operator+(const Vector& other) const {
    Vector result;
    // 实现向量相加的逻辑
    return result;
}

类的概念与结构体类似,相对结构体而言多了类内部的函数(方法),权限的划分,重载,多台以及继承等相关概念. 在类的构造函数调用优先级是先创建父类,再构造子类成员对象,最后调用子类的构造函数,创建出该类本身.

结构体

结构体是一些变量的集合体,结构体的定义如下

struct Person {
    std::string name;
    int age;
    float height;
};

也可以使用typedef定义别名

typedef struct {
    std::string name;
    int age;
} Person;  // 为结构体定义别名 Person

其他

为了内存更加快速的访问,结构体在编译的时候,会进行优化,一般会有一个结构体对齐: 对齐分别有8,16,32 字节对齐方式.

结构体偏移逆向分析

结构体的首地址: 0x89962A23D4

偏移量计算: (var0 是上一个变量,var1是当前变量,zp是对齐方式),首地址偏移量为0

偏移量 = MIN(zp,sizeof(var0))*n - sizeof(var1)

n 值需要满足

MIN(zp,sizeof(var0))*n%zp == 0条件满足下的n最小值

偏移量 = 先前成员的结束地址 + 填充

填充的值,为凑成对齐的整数倍最小需要填充的大小.

对齐的目的是确保每一个成员变量,起始地址都是对齐大小的整数倍.逆向分析的时候,观察地址,如果后面连续性的地址都是某个数(8 16 32 )的整数倍,则可以考虑是一个结构体.

友元函数,友元类

友元函数(Friend Function)是 C++ 中的一种特殊函数,它可以访问类的私有成员和保护成员。友元函数并不是该类的成员函数,但可以被该类的对象调用。友元关系是单向的,意味着如果类 A 是类 B 的友元,类 B 并不能访问类 A 的私有成员。

#include <iostream>

class Box {
private:
    double width;

public:
    Box(double w) : width(w) {}

    // 声明友元函数
    friend void printWidth(Box box);
};

// 定义友元函数
void printWidth(Box box) {
    // 可以访问 Box 的私有成员
    std::cout << "Width of box: " << box.width << std::endl;
}

int main() {
    Box box(5.0);
    printWidth(box); // 调用友元函数
    return 0;
}

友元类(Friend Class)是 C++ 中的一种特性,它允许一个类的所有成员函数访问另一个类的私有和保护成员。通过将一个类声明为另一个类的友元类,后者的所有成员函数都可以直接访问前者的私有数据。

#include <iostream>

class ClassB; // 前向声明

class ClassA {
private:
    int valueA;

public:
    ClassA(int val) : valueA(val) {}

    // 声明 ClassB 为友元类
    friend class ClassB;
};

class ClassB {
public:
    void showValue(ClassA a) {
        // 可以访问 ClassA 的私有成员
        std::cout << "Value of A: " << a.valueA << std::endl;
    }
};

int main() {
    ClassA a(10);
    ClassB b;
    b.showValue(a); // 调用友元类的方法
    return 0;
}