C++中重定义,重载,重写

重定义

C++中的重定义指在同一作用域内定义了同名的函数、变量或类型。重定义是编译器无法处理的语法错误,将导致程序无法编译通过。

例如,在同一作用域内定义了两个函数名相同、参数列表相同的函数,就会产生重定义错误。如下是一个示例:

C++中的重定义指在同一作用域内定义了同名的函数、变量或类型。重定义是编译器无法处理的语法错误,将导致程序无法编译通过。

例如,在同一作用域内定义了两个函数名相同、参数列表相同的函数,就会产生重定义错误。如下是一个示例:

```
int add(int a, int b) {
    return a + b;
}

int add(int x, int y) { // 重定义
    return x + y;
}

int main() {
    int sum = add(1, 2);
    return 0;
}
```

上述代码中,定义了两个同名同参数的函数`add`,编译器将无法区分它们,就会产生重定义错误。解决方法是修改其中一个函数名或参数列表。

上述代码中,定义了两个同名同参数的函数`add`,编译器将无法区分它们,就会产生重定义错误。解决方法是修改其中一个函数名或参数列表。

当重定义和重载重写一起被问到的时候,多数指的是,子类中有一个成员变量或成员方法和父类中的成员变量或成员方法名称相同,且父类中成员函数不是虚函数的情况,此时子类的成员变量或成员方法会将父类的成员变量或方法给隐藏起来,实际父类的成员和成员方法在子类中依然存在只是被隐藏了,使用父类的作用域运算符依然可以调用。

(另外一提,如果全局变量被局部变量重定义给隐藏了,此时全局变量处于匿名作用域空间中,即使用::即可进行调用)

重载

C++中的重载(overloading)是指在同一个作用域内声明多个同名函数或运算符,但它们的形参列表不同,可以根据传入的参数类型和数量来自动调用不同的函数或运算符。重载的目的是提高程序的灵活性和可读性。

重载函数的形参列表必须不同,可以通过以下方式进行区分:

1. 参数数量不同
2. 参数类型不同
3. 参数顺序不同

例如,下面是三个重载函数,它们都有相同的名字`sum`,但是它们的参数列表不同:

int sum(int a, int b);
double sum(double a, double b);
int sum(int a, int b, int c);
 

当调用sum函数时,编译器会自动根据传入的参数类型和数量选择正确的函数进行调用。例如:

int result1 = sum(2, 3); // 调用int sum(int a, int b);
double result2 = sum(2.5, 3.5); // 调用double sum(double a, double b);
int result3 = sum(2, 3, 4); // 调用int sum(int a, int b, int c);
 

总之,重载为使用者提供了更加便利的操作方式,提高了代码的可读性和可维护性。

c++中形参为引用和非引用时不属于重载,形参为常引用和引用时是重载,普通指针和常量指针也属于重载,常指针和指针常量也属于重载,使用typededef定义的类型也不属于重载。

c++中提供了运算符重载

运算符重载是指在程序中自定义运算符的行为,使其可以用于自定义类型的对象。在C++中,可以重载多种运算符,例如算术运算符(+、-、*、/)、关系运算符(<、>、<=、>=、==、!=)、逻辑运算符(&&、||、!)、位运算符(&、|、^、~、<<、>>)等。

返回类型 operator 运算符(参数列表){
    // 运算符的操作
    return 返回值;
}
 

其中,operator是关键字,运算符可以是已有的运算符,也可以是自定义的运算符。参数列表可以是零个或多个参数,返回值可以是任意数据类型(包括自定义的类型)。

例如,我们可以重载+运算符,使得两个自定义类型对象可以直接相加:

class MyInt {
private:
    int num;
public:
    MyInt(int n = 0) : num(n) {}
    MyInt operator+(const MyInt& other) {
        return MyInt(num + other.num);
    }
};

int main() {
    MyInt a(3), b(4);
    MyInt c = a + b; // 相当于 c = a.operator+(b)
    cout << c << endl; // 输出 7
    return 0;
}
 

重写

C++重写是指对已有的C++代码进行重构和优化,以提高其性能和可维护性,同时保持原有功能不变的过程。

C++重写一般涉及以下步骤:

1. 对原有代码进行分析和评估,确定需要重写的模块或部分。

2. 设计新的代码架构,考虑如何改进代码的性能、可读性、可扩展性等方面,并确定使用的数据结构、算法和设计模式。

3. 重新编写代码,注意代码风格、命名规范、注释等方面的标准化。

4. 进行单元测试,确保新代码能够正确地运行,并与原有代码进行对比测试,确保重写后的代码性能和功能都得到了改进。

5. 对新代码进行集成测试和系统测试,确保新代码能够与其他模块或系统协同工作,并且没有新的错误或问题。

6. 将新代码部署到生产环境,并对用户和其他利益相关者进行演示和培训。

C++重写虽然比较耗费时间和精力,但可以极大地提高代码质量和性能,使得系统更加健壮和高效。

通俗易懂的来说,c++中的重写,即派生类继承了基类之后,基类中的虚函数,可以在派生类中重写,要求函数名,函数列表,函数返回值都相同,因为虚函数是存于类对象内存中的虚拟函数表内的,未重写时,派生类的虚函数表中即为基类中的虚函数,当重写发生后,派生类的虚拟函数表中存储的即是重写后本类中的函数,因此,重写之后会有覆盖现象,即派生类的方法覆盖了基类的方法,此时通过派生类就无法使用基类中的该方法了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值