在visual_studio中想做一个[]重载的小练习,
#include <cstring>#include <iostream>using namespace std;struct Person{ double salary; char *name;};class SalaryManage{private: Person *employ; int max; int n;public: SalaryManage(int Max = 0) :max(Max),n(0),employ(new Person[max]) { } double &operator[](char *Name) { Person *p; for (p = employ;p < employ + n;p++) if (strcmp(p->name, Name) == 0) return p->salary; p = employ + n++; p->name = new char[strlen(Name) + 1]; strcpy(p->name, Name); p->salary = 0; return p->salary; } void display() { for (int i = 0;i < n;i++) cout << employ[i].name << " " << employ[i].salary << endl; } ~SalaryManage() { delete[] employ; }};int main(){ SalaryManage s(3); s["张三"] = 2188.88; s["里斯"] = 1234.65; s["王五"] = 3200.98; cout << "张三\t" << s["张三"] << endl; cout << "里斯\t" << s["里斯"] << endl; cout << "王五\t" << s["王五"] << endl; s.display();}
可是主函数部分显示
作为C++新手,请大佬们帮忙指点一二
这个错误是由于您在 SalaryManage
类的 operator[]
中没有正确地处理数组越界的情况。当您没有找到与 Name
匹配的名称时,您创建了一个新的 Person
对象并将其添加到数组的末尾,但您没有更新 n
的值,这导致在尝试访问不存在的数组索引时出现错误。
为了解决这个问题,您应该在添加新 Person
对象后将 n
的值增加 1。这样,您就可以正确地访问新添加的元素。此外,您应该在 display
函数中更新数组的长度。以下是更正后的代码:
#include <cstring>#include <iostream>using namespace std;struct Person{ double salary; char *name;};class SalaryManage{private: Person *employ; int max; int n;public: SalaryManage(int Max = 0) :max(Max),n(0),employ(new Person[max]) { } double& operator[](const char* Name) { Person *p = nullptr; for (int i = 0; i < n; i++) { if (strcmp(employ[i].name, Name) == 0) { p = &employ[i]; break; } } if (p == nullptr) { p = &employ[n++]; p->name = new char[strlen(Name) + 1]; strcpy(p->name, Name); p->salary = 0; } return p->salary; } void display() const { for (int i = 0; i < n; i++) cout << employ[i].name << " " << employ[i].salary << endl; } ~SalaryManage() { delete[] employ; }};int main(){ SalaryManage s(3); s["张三"] = 2188.88; s["里斯"] = 1234.65; s["王五"] = 3200.98; cout << "张三\t" << s["张三"] << endl; cout << "里斯\t" << s["里斯"] << endl; cout << "王五\t" << s["王五"] << endl; s.display();}
在 C++ 中,类型的名字(包括类的名字)本身也是一种运算符,即类型强制转换运算符。 类型强制转换运算符是单目运算符,也可以被重载,但只能重载为成员函数,不能重载为全局函数。经过适当重载后, 这个对对象进行强制类型转换的表达式就等价于 ,即变成对运算符函数的调用。 下面的程序对 double 类型强制转换运算符进行了重载。 程序的输出结果是: 1.2 3.2 第 8 行对 double 运算符进行
C++ 规定,下标运算符 必须以成员函数的形式进行重载。该重载函数在类中的声明格式如下: 返回值类型 & operator[ ] (参数); 或者: const 返回值类型 & operator[ ] (参数) const; 使用第一种声明方式, 不仅可以访问元素,还可以修改元素。使用第二种声明方式, 只能访问而不能修改元素。在实际开发中,我们应该同时提供以上两种形式,这样做是为了适应 const
C ++允许您为同一范围内的function名称或operator指定多个定义,分别称为function overloading和operator overloading 。 重载声明是声明,声明与同一作用域中先前声明的声明具有相同的名称,除了两个声明具有不同的参数和明显不同的定义(实现)。 当您调用重载function或operator ,编译器通过将用于调用函数或运算符的参数类型与定义中指定的
本文向大家介绍C#中WebClient实现文件下载,包括了C#中WebClient实现文件下载的使用技巧和注意事项,需要的朋友参考一下 鉴于各种复杂的网络环境,笔者决定采用不同的编程接口进行下载尝试,以增加程序的可用性。 这里仅介绍使用 WebClient 的方法,后续的文章会介绍其他的方法。博文中主要介绍思路和关键代码,完整的 demo 附在文末。 使用代理访问网络 很多公司的员工都是通过公司设
自增 和自减 都是一元运算符,它的前置形式和后置形式都可以被重载。请看下面的例子: 运行结果: s1: 00:00 s2: 00:01 s1: 00:01 s2: 00:01 上面的代码定义了一个简单的秒表类,m_min 表示分钟,m_sec 表示秒钟,setzero() 函数用于秒表清零,run() 函数是用来描述秒针前进一秒的动作,接下来是三个运算符重载函数。 先来看一下 run() 函数的实
主要内容:重载输入运算符>>,重载输出运算符<<,综合演示在 C++中,标准库本身已经对左移运算符 和右移运算符 分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool、int、double 等)和标准库所包含的类类型(例如 string、complex、ofstream、ifstream 等)。 如果我们自己定义了一种新的数据类型,需要用输入输出运算符去处理,那么就必须对它们进行重载。本节以前面