最新要闻
- 天天微动态丨比亚迪智能手表亮相:一键控车 可完美替代车钥匙
- 买了电动牙刷 没想到越用牙越废
- 观天下!宝马X3变X6!男子买二手宝马X3买到全损事故车 退1赔3得97万
- 印度机长飞行中吃早餐 咖啡直接放在油门把手上!双双被罚
- 24层楼高!首艘国产大型邮轮预计年底交付:零件数是复兴号高铁13倍
- 环球热点评!xj威客网可信不_xj威客网
- 全球热点评!暴雪火速排查《暗黑4》排队问题
- 天天讯息:别等降价了!长城坦克推全年保价政策 年底前官降返差价
- 全球快资讯丨《名侦探柯南》里出现九转大肠厨师和评委:网友直呼瞬间出戏
- 环球简讯:知名车评人吐槽宝马漏机油养活他家修理厂 原因直指塑料气门室盖
- 天天新资讯:郭帆谈《流浪地球2》“50岁以上出列”拍摄:喊停了外国群演还在哭
- 全球短讯!给蚊子送上夏天第一拍!雅格电蚊拍大促:10.9元到手
- 今日要闻!迪士尼正版授权 泰国乳胶凉席三件套大促!原价190 券后90
- 远大前程多少集_远大前程介绍
- 全球热资讯!《寂静岭2:重制版》美术谈护士穿丝袜:曾被指责皮肤暴露
- 最尴尬的新造车:称车主可活100岁 碰撞测试得分0
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天微动态丨C++ | 运算符重载
1. 运算符重载
1.1 基本概念
函数重载(函数多态)是指用户能够定义多个名称相同但参数列表不同的函数,旨在使用户能够用同名的函数来完成相同的基本操作,即使这种操作被用于不同的数据类型。
(资料图片)
运算符重载将重载的概念扩展到运算符上,允许赋予C++运算符多种含义。
实际上,很多C++(也包括C语言)运算符已经被重载。例如,将*运算符用于地址,将得到存储在这个地址中的值;但用于两个数字时,得到的是它们的乘积。
C++允许运算符重载扩展到用户自定义的类型,例如,允许使用+将两个对象相加。编译器将根据操作数的数目和类型决定使用哪种假发定义。重载运算符可使代码看起来更自然。例如,将两个数组相加通常使用for循环实现:
for(int i=0; i< 10; i++){ A[i] = B[i] + C[i];}
但在C++中,可以定义一个表示数组的类,并重载+运算符。于是便有如下语句:
A = B + C;
1.2 运算符重载函数格式
要重载运算符,需使用被称为运算符函数的特殊函数形式。运算符函数的格式如下:
operatorOP(param1, param2, ...)
例如,operator+()
表示重载+
运算符,operator*()
表示重载*
运算符。OP
必须是有效的C++运算符,不能虚构一个新的符号,例如不能有operator@()
这样的函数,因为C++中没有@
运算符。
1.3 案例:重载运算符+
time.h
#ifndef TIME_H#define TIME_Hclass Time{private:int hours;int minutes;public:Time();Time(int h, int m = 0); // 注意:此处不能h和m都设置默认值,否则将和Time()冲突void addMin(int m);void addHour(int h);void resetTime(int h = 0, int m = 0);Time operator+(const Time &t) const; // 运算符重载void show() const;};#endif
如果Time(int h = 0, int m = 0);均设置默认值,使用时创建对象Time t;编译器将不知道是该调用默认构造函数还是带参构造函数(因为带参构造两个参数均有默认值,均可以省略)。
头文件管理:
在同一个文件中只能将同一个头文件包含一次。记住这个规则很容易,但很可能在不知情的情况下将头文件包含多次。例如,可能使用包含了另外一个头文件的头文件。有一种标准的C/C++技术可以避免多次包含同一个头文件。它是基于预处理器编译指令#ifndef(即if not defined)
的。下面的代码片段意味着仅当以前没有使用预处理器编译指令#define定义名称TIME_H时,才处理#ifndef
和#endif
之间的语句:
#ifndef TIME_H...#endif
编译器是首次遇到该文件时,名称TIME_H
没有定义(我们一般根据include文件名来选择名称,并加上一些下划线,以创建一个在其他地方不太可能被定义的名称)。
time.cpp
#include #include "time.h"Time::Time(){hours = minutes = 0;}Time::Time(int h, int m){hours = h;minutes = m;}void Time::addMin(int m){minutes += m;hours += minutes / 60;minutes %= 60;}void Time::addHour(int h){hours += h;}void Time::resetTime(int h, int m){hours = h;minutes = m;}Time Time::operator+(const Time &t) const{Time sum;sum.minutes = minutes + t.minutes;sum.hours = hours + t.hours + sum.minutes/60;sum.minutes %= 60;return sum;}void Time::show() const{std::cout << hours << "小时 " << minutes << "分钟" << std::endl;}
usetime.ccpp
#include#include"time.h"int main(){using std::cout;using std::endl;Time time1(2, 45);time1.show();Time time2(1, 56);time2.show();Time time3 = time1 + time2;time3.show();Time time4 = time1.operator+(time2);time4.show();Time time5 = time1 + time2 + time3;time5.show();return 0;}
输出:
2小时 45分钟1小时 56分钟4小时 41分钟4小时 41分钟9小时 22分钟
Time time5 = time1 + time2 + time3;
是如何被转换为函数调用的:由于
+
是从左向右结合,因此上述语句首先被转换为:
Time time5 = time1.operator+(time2 + time3);
然后,函数参数本身被转换为一个函数调用,结果为:
Time time5 = time1.opearator+(time2.operator+(time3));
。
2. 运算符重载注意事项
重载后的运算符必须至少有一个操作数是用户自定义的类型,这将防止用户为标准类型重载运算符。
使用运算符时不能违反运算符原来的句法规则。例如,不能将求模运算符(%)重载成使用一个操作数。同样,不能修改运算符的优先级。因此,如果将加号运算符重载成将两个类相加,则新的运算符与原来的加号具有相同的优先级。
不能创建新的运算符。例如,不能定义operator**()函数来表示求幂。
不能重载下面的运算符:
sizeof
:sizeof运算.
:成员运算符.*
:成员指针运算符::
:作用域解析运算符?:
:条件运算符typeid
:一个RTTI运算符const_cast
:强制类型转换运算符dynamic_cast
:强制类型转换运算符reinterpret_cast
:强制类型转换运算符static_cast
:强制类型转换运算符
下表中的大多数运算符都可以通过成员或非成员函数进行重载,
但下面的运算符值能通过成员函数进行重载
。=
:赋值运算符()
:函数调用运算符[]
:下标运算符->
:通过指针访问类成员的运算符
3. 运算符重载与友元:重载运算符<<
3.1 <<
的第一种重载版本
要使Time类知道使用cout,必须使用友元函数。这是因为下面这样的语句使用两个对象,其中一个时ostream类对象(cout):
cout << time;
如果使用一个Time成员函数来重载<<,Time对象将是第一个操作数,这就意味着必须这样使用<<:
time << cout;
而这样会令人迷惑,但通过友元函数,可以像下面这样重载运算符:
void operator<<(ostream &os, const Time &t){ os << t.hours << t.minutes;}
time.h
#ifndef TIME_H#define TIME_H#includeclass Time{private:int hours;int minutes;public:Time();Time(int h, int m = 0);void addMin(int m);void addHour(int h);void resetTime(int h = 0, int m = 0);Time operator+(const Time &t) const;// void show() const; 去除show方法,转而由<<重载函数替代friend void operator<<(std::ostream &os, const Time &t); // 友元函数对<<进行重载};#endif
time.cpp
#include #include "time.h"Time::Time(){hours = minutes = 0;}Time::Time(int h, int m){hours = h;minutes = m;}void Time::addMin(int m){minutes += m;hours += minutes / 60;minutes %= 60;}void Time::addHour(int h){hours += h;}void Time::resetTime(int h, int m){hours = h;minutes = m;}Time Time::operator+(const Time &t) const{Time sum;sum.minutes = minutes + t.minutes;sum.hours = hours + t.hours + sum.minutes/60;sum.minutes %= 60;return sum;}void operator<<(std::ostream &os, const Time &t){os << t.hours << "小时 " << t.minutes << "分钟";}
usetime.cpp
#include#include"time.h"int main(){using std::cout;using std::endl;Time time1(2, 45);cout << time1;return 0;}
输出:
3.2 <<
的第二种重载版本
<<的第一种重载版本虽然成功使得cout << time;
正常工作,但是不支持连续输出:
cout << “时间为:” << time << endl;
而这是由于在iostream定义中,<<
运算符要求左边必须是一个ostream对象,由于cout是ostream对象,所以重载后cout << time;
满足这种要求。但是重载之后,cout << x << y;
中cout<
因此,第二种重载版本便是将重载函数operator<<()的返回值设置成ostream对象的引用即可:
ostream& operator<<(ostream &os, const Time &t){ os << t.hours << t.minutes; return os;}
注意:返回类型是ostream&,而不是ostream。这是因为若返回类型是ostream,将调用ostream类的拷贝构造函数,但是ostream的拷贝构造函数是private权限。而返回类型是ostream&,意味着函数的返回值就是传递给该函数的对象。
time.h
#ifndef TIME_H#define TIME_H#includeclass Time{private:int hours;int minutes;public:Time();Time(int h, int m = 0);void addMin(int m);void addHour(int h);void resetTime(int h = 0, int m = 0);Time operator+(const Time &t) const;friend std::ostream& operator<<(std::ostream &os, const Time &t); // <<的第二种重载版本};#endif
time.cpp
#include #include "time.h"Time::Time(){hours = minutes = 0;}Time::Time(int h, int m){hours = h;minutes = m;}void Time::addMin(int m){minutes += m;hours += minutes / 60;minutes %= 60;}void Time::addHour(int h){hours += h;}void Time::resetTime(int h, int m){hours = h;minutes = m;}Time Time::operator+(const Time &t) const{Time sum;sum.minutes = minutes + t.minutes;sum.hours = hours + t.hours + sum.minutes/60;sum.minutes %= 60;return sum;}std::ostream& operator<<(std::ostream &os, const Time &t){os << t.hours << "小时 " << t.minutes << "分钟";return os;}
usetime.cpp
#include#include"time.h"int main(){using std::cout;using std::endl;Time time1(2, 45);cout << "时间为:" << time1 << endl;return 0;}
输出:
时间为:2小时 45分钟
4. 重载运算符=
4.1 编译器默认给类提供了一个默认的赋值运算符重载函数
默认的赋值运算符重载函数进行了简单的赋值操作。
demo
#include #include using namespace std;class Person{friend void Display(Person &p){ cout << "id:" << p.id << " name:" << p.name << endl; }private: int id; string name;public: Person(int id, string name){ this->id = id; this->name = name; }};int main(){ Person p1(1, "leo"); Person p2(2, "mike"); Display(p1); Display(p2); p1 = p2; Display(p1); Display(p2); return 0;}
输出:
id:1 name:leoid:2 name:mikeid:2 name:mikeid:2 name:mike
4.2 当类含有成员指针时,默认的赋值运算符重载函数将出现异常
#include #include using namespace std;class Person{friend void Display(Person &p){ cout << "id:" << p.id << " name:" << p.name << endl; }private: int id; char *name;public: Person(int id, const char *name){ this->id = id; this->name = new char[strlen(name)+1]; strcpy(this->name, name); } ~Person(){ if(this->name != NULL){ delete[] this->name; this->name = NULL; } }};void test(){ Person p1(1, "leo"); Person p2(2, "mike"); Display(p1); Display(p2); p1 = p2; Display(p1); Display(p2);}int main(){ test(); return 0;}
输出(报错):
id:1 name:leoid:2 name:mikeid:2 name:mikeid:2 name:mikefree(): double free detected in tcache 2
注意,由于未给Person重载赋值运算符,将调用编译器默认提供的赋值运算符重载函数。但是默认的赋值运算符重载函数只进行了简单的赋值操作,即浅拷贝。浅拷贝示意图如下。
所以,当类含有成员指针时,需要为其重载赋值运算符函数,代码如下:
// 重载赋值运算符操作Person& operator=(const Person &p){ if(this->name != NULL){ delete[] name; name = NULL; } this->name = new char[strlen(p.name) + 1]; strcpy(this->name, p.name); this->id = p.id; return *this;}
Q1:为什么需要先判断this->name是否为空?
由于调用赋值运算符重载函数时,此时当前对象(*this)已经创建完毕,那么就有可能this->name指向堆内存。这个时候如果不对其name指针进行判断而直接进行赋值,会导致this原指向内存得不到及时释放。
Q2:为什么返回引用类型*this?
为了实现连续赋值。如p1 = p2 = p3
,意义为p3赋值给p2,然后p2赋值给p1。如果Person的赋值重载函数返回的是Person而不是Person&,那么p2 = p3
这个表达式将会产生一个新的匿名对象,然后将这个匿名对象赋予p1。
C++规定为了实现连续赋值,赋值操作符必须返回一个引用指向操作符的左侧实参。这是为class实现赋值操作符必须遵循的协议。这个协议不仅适用于标准的赋值形式,也适用于+=、-=、*=等。
void test(){ Person p1(1, "leo"); Person p2(2, "mike"); p1 = p2; cout << &(p1 = p2) << endl; cout << &p1 << endl;}
输出:
0x61fdd00x61fdd0
5. 重载运算符++
++
属于一元运算符。一般有前置操作和后置操作两种情况(即前置加加++i
和后置加加i++
)。
而对一元运算符进行重载需实现“编译器能够根据运算符出现在作用对象的前面还是后面来调用不同的函数”。
C++规定:
- 当编译器看到++a(即前置++)时,它就会调用a对象所属类重载的operator++()方法;
- 当编译器看到a++(即后置++)时,它就会调用a对象所属类重载的operator++(int)方法。
注:
- C++标准规定++a的显示调用形式为:a.operator++();
- 后置重载函数operator++(int)中之所以有一个int型形参,目的是为了绕过语法的限制,该形参并没有什么实质的作用。(因为方法重载需要满足参数个数或参数类型不一致)
demo:
#include using namespace std;class Complex{// 友元函数:重载<<运算符friend ostream& operator<<(ostream& os, Complex &co){ os << "A: " << co.mA << " B: " << co.mB; return os;}public: Complex(){ this->mA = 0; this->mB = 0; } // 重载前置++ Complex& operator++(){ mA++; mB++; return *this; } // 重载后置++ const Complex operator++(int){ Complex tmp(*this); ++(*this); return tmp; } // 重载前置-- Complex& operator--(){ mA--; mB--; return *this; } // 重载后置-- const Complex operator--(int){ Complex tmp(*this); --(*this); return tmp; } private: int mA; int mB;};int main(){ Complex cp; cout << cp << endl; // A: 0 B: 0 Complex re = cp++; cout << re << endl; // A: 0 B: 0 cout << cp << endl; // A: 1 B: 1 ++cp; cout << cp << endl; // A: 2 B: 2 return 0;}
输出:
A: 0 B: 0A: 0 B: 0A: 1 B: 1A: 2 B: 2
Q1: a++的返回类型为什么要是const对象呢?
有两个原因:
- 如果不是const对象,a(++)++这样的表达式就可以通过编译。但是,其效果却违反了我们的直觉 。a其实只增加了1,因为第二次自增作用在一个临时对象上。
- 另外,对于内置类型,(i++)++这样的表达式是不能通过编译的。自定义类型的操作符重载,应该与内置类型保持行为一致 。
a++的返回类型如果改成非const对象,肯定能通过编译,但是我们最好不要这样做。
Q2: ++a的返回类型为什么是引用呢?
这样做的原因应该就是:与内置类型的行为保持一致。前置++返回的总是被自增的对象本身。因此,++(++a)的效果就是a被自增两次。
6. 智能指针类&重载指针运算符
6.1 引子
#include#includeusing namespace std;class Person{private:string name;public:Person(){ name="no name"; }Person(string name){ this->name=name; }void show(){ cout << "name=" << name << endl;}};int main(){Person *p = new Person("Mike");p->show();delete p; // 如果忘记释放,那么就会造成内存泄漏p = NULL;return 0;}
输出:
name=Mike
对象在堆区开辟内存,不会自动调用析构函数,若不利用delete进行手动释放,将会造成内存泄漏。
6.2 智能指针类:托管new出来的对象的释放
智能指针类:
class SmartPoint{private:Person *p;public:SmartPoint(){ p=NULL; }SmartPoint(Person *p){cout << "SmartPoint带参构造" << endl;this->p=p;}~SmartPoint(){cout << "SmartPoint析构" << endl;if(p!=NULL){delete p;p = NULL;}}};
使用demo:
void test_func(){Person *p = new Person("Mike");p->show();SmartPoint sm(p);}int main(){test_func();return 0;}
输出:
name=MikeSmartPoint带参构造SmartPoint析构
6.3 重载指针运算符(*和->)
class SmartPoint{private:Person *p;public:SmartPoint(){ p=NULL; }SmartPoint(Person *p){cout << "SmartPoint带参构造" << endl;this->p=p;}~SmartPoint(){cout << "SmartPoint析构" << endl;if(p!=NULL){delete p;p = NULL;}}Person* operator->(){ return this->p; } // 重载->运算符号Person& operator*(){ return *(this->p); } // 重载*运算符号};
使用:
void test_func(){Person *p = new Person("Mike");SmartPoint sm(p);sm->show(); // 本质sm->->show(); 编译器简化为sm->show()(*sm).show(); // *sm相当于-----sm.operator*(),返回值是(*person)}int main(){test_func();return 0;}
输出:
SmartPoint带参构造name=Mikename=MikeSmartPoint析构
关键词:
-
每日快播:BUUCTF-MISC-面具下的flag(vmdk的解压和Brainfuck与Ook解密)
准备工作下载附件得到一个一张图片丢入winhex,发现还有一个flag vmdk文件vmdk文件其实是虚拟机使用...
来源: 天天微动态丨C++ | 运算符重载
每日快播:BUUCTF-MISC-面具下的flag(vmdk的解压和Brainfuck与Ook解密)
天天微动态丨比亚迪智能手表亮相:一键控车 可完美替代车钥匙
买了电动牙刷 没想到越用牙越废
观天下!宝马X3变X6!男子买二手宝马X3买到全损事故车 退1赔3得97万
印度机长飞行中吃早餐 咖啡直接放在油门把手上!双双被罚
看New Bing回答世纪难题:女友和妈妈掉水里先救谁
24层楼高!首艘国产大型邮轮预计年底交付:零件数是复兴号高铁13倍
环球热点评!xj威客网可信不_xj威客网
全球热点评!暴雪火速排查《暗黑4》排队问题
天天讯息:别等降价了!长城坦克推全年保价政策 年底前官降返差价
全球快资讯丨《名侦探柯南》里出现九转大肠厨师和评委:网友直呼瞬间出戏
环球简讯:知名车评人吐槽宝马漏机油养活他家修理厂 原因直指塑料气门室盖
【世界热闻】探究C# dynamic动态类型本质
天天新资讯:郭帆谈《流浪地球2》“50岁以上出列”拍摄:喊停了外国群演还在哭
全球短讯!给蚊子送上夏天第一拍!雅格电蚊拍大促:10.9元到手
今日要闻!迪士尼正版授权 泰国乳胶凉席三件套大促!原价190 券后90
检查 Linux 系统是运行在虚拟机上还是物理机上
远大前程多少集_远大前程介绍
全球热资讯!《寂静岭2:重制版》美术谈护士穿丝袜:曾被指责皮肤暴露
最尴尬的新造车:称车主可活100岁 碰撞测试得分0
50吨!山东探获一大型金矿床:服务年限可达20年以上
世界视点!读Java性能权威指南(第2版)笔记21_垃圾回收H
优化利器In-Memory开启和效果
全球关注:谈谈 Vue toRef 和 reactive
天天报道:博主带卷尺吃披萨发现尺寸不够:99元12寸披萨直径少2.5厘米
女子称点外卖备注送上楼被骑手教育:四块钱还想让送上楼
三亚骂游客导游被吊销导游证罚款5万:网友点赞 低价团慎重参与
重庆东站一项目招标条件被指“量身定做”:招标人答疑,公管局正处理投诉
mysql 索引(InnoDB)
环球关注:快速带你入门css
世界热门:Git常用命令总结
环球热门:马龙樊振东会师决赛:国乒包揽大满贯5冠
当前热议!俞敏洪谈野生虾事件:犯了错误 就要去改正
世界最资讯丨情侣称住41层酒店被“玻璃人”看光引热议:网友支持酒店已提示
热文:数据安全始终是一个不可忽视的问题
世界最资讯丨数据结构-绪论
全球讯息:职工医保报销比例2022_职工医保报销比例
全球观点:OpenAI CEO谈GPT4:人类迄今开发的最伟大技术 有点害怕了
即时:曹曦月方否认带货3个月成交278元:拿证据说话
希尔排序、快速排序、KMP算法
环球热推荐:008爬虫之短短20行代码下载周杰伦所有歌曲
一次 Hyperf 注解失效问题分析
全球看热讯:Qt+百度AI文字识别OCR小工具
国内外多名大胃王意外死亡 有人胖到320斤有人开播前突然昏迷:专家科普
热点在线丨2023省选16天
著名的Breach黑客论坛管理员被捕
环球微头条丨男子整形后称没法靠颜值吃饭了:丢了工作
《暗黑4》公测性能实测:RTX 4090显卡流畅跑8K
世界短讯!SSL/TLS协议运行机制的概述
最新资讯:重学c#系列—— explicit、implicit与operator[三十四]
世界要闻:李彦宏谈文心一言:市场反馈符合预期 股价波动没必要解释
焦点滚动:挺能藏啊!男子电动滑板车藏84个SSD入境被海关查获
【天天快播报】webpack原理(2):ES6 module在Webpack中如何Tree-shaking构建
CTF show 信息收集篇
Quicker 快速开发,控制脚本关闭(示例,鼠标连点器)
天天微头条丨卡佩罗:那不勒斯和国米将晋级 迈尼昂和奥纳纳是米兰双雄的关键
每日观点:曹姓明星收20万带货3月成交278元 被判退还13.9万:要量力而行
13代酷睿躺赢了 4nm锐龙7000跳票:此前规格被砍2刀
已知球面经纬度求方位角和反方位角(awk一行代码实现)
环球观热点:《流浪地球2》门框机器人科幻十足 设计师详解:还能晾衣服能甩干
东北首条海下/跨海地铁!大连地铁5号线正式运营
世界热讯:Linux学习笔记
报道:插件化架构设计(2):插件化从设计到实践该考量的问题汇总
【天天新要闻】Vins 前端中高效的去畸变的方式解析
动态焦点:暴雪:《暗黑》系列能成功多亏了韩国玩家热情和爱戴
全球观点:朱雀二号遥一运载火箭发射失利:已查明飞行故障 通过归零评审
全球热头条丨《雷霆沙赞2》豆瓣开分6.5:加朵女神加分、剧情被批幼稚低级
【全球独家】万字血书Vue—Vue的核心概念
张兰被曝国外欠债9.8亿,海外家庭信托被追债,拼命带货疑为还债
Ocelot使用与设置路由Routing
环球速递!arthas排查线上问题真是太好用了!
肯德基全家桶被曝吃出生的炸鸡!店家回应是锅出现故障
世界快播:C++ class struct
环球视点!Windows OpenGL ES 图像 GPUImageLookupFilter
世界观速讯丨8万元会成爆款吗?宝骏悦也实车曝光:像吉姆尼、能跑303公里
每日热文:印度男子因新娘高三成绩不好要求退婚 还要退5千彩礼:网友看笑
世界观焦点:CSS学习笔记
热门看点:女生被拍同学勇敢对峙让男子删除 想保护好自己的朋友:网友称赞勇敢
1.5mm!iPhone 15 Pro Max将打破最薄边框纪录:CAD外观渲染图曝光 更帅了
全球微头条丨没有科技与狠活 :依能天然苏打水2.3元发车 无糖无气0卡
03月18日09时福建漳州疫情数据 阳了以后为什么会腰疼?应该怎么办?
当前要闻:为什么文件删除了但磁盘空间没有释放?
微博图床被废,自己动手丰衣足食。
【聚看点】Source Generator初探
4、AOP
天天亮点!汽车降价潮蔓延!成都豪撒1亿购车补贴 汽车流通协会称武汉汽车降价不公平
【天天热闻】俞敏洪称下辈子宁愿当没钱的流浪汉:自己周围的企业家都在没日没夜的干活
比亚迪出海再下一城!乌兹比克斯坦三车齐发:宋PLUS 22万起售
世界聚焦:调查显示民众预期英国央行将继续加息
【全球速看料】差距有多大?一图看懂蔚来、小鹏、理想汽车2022年第四季度财报:老大变了
每日速读!水晶球档杆绝无仅有!韩系豪华电动车捷尼赛思GV60上市:28.58万起
世界速讯:你对Linux窗口管理程序Tmux了解吗
【全球聚看点】还买什么汉兰达!全新大七座SUV福特锐界L开售:22.98万历史新低
【世界速看料】超市6500元招聘引学生排队投简历 负责人:已收到五十多份
世界看点:南宁市2023年事业单位统一考试简章发布 337个岗位共招1764人
【当前独家】读Java性能权威指南(第2版)笔记20_垃圾回收G
何小鹏:王凤英一周工作七天、让大家很卷
何小鹏谈竞争对手降价:油车一定会反击、小鹏将降低25%生产成本
springboot跨域问题解决方案