c++ 函数后的关键字
C++函数后面加const关键字
C++函数后面加throw关键字
C++11引入的关键字=default、=delete、override、final
=default
=delete
override
C++函数后面加const关键字
非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用)
唯一的例外是对于mutable修饰的成员。
加了const的成员函数可以被非const对象和const对象调用,但不加const的成员函数只能被非const对象调用
1
2
3
4
char getData() const
{
return this->letter;
}
C++函数后面加throw关键字
void fun() throw() 表示fun不允许抛出任何异常,即fun是异常安全的。
void fun() throw(…) 表示fun可以抛出任何形式的异常。
void fun() throw(exceptionType) 表示fun只能抛出exceptionType类型的异常。
void GetTag() throw(int); 表示只抛出int类型异常
void GetTag() throw(int,char); 表示抛出in,char类型异常
void GetTag() throw(); 表示不会抛出任何类型异常
void GetTag() throw(…); 表示抛出任何类型异常
那么,void GetTag() throw(int); 表示只抛出int类型异常 这句解释怎么理解呢?
并不表示一定会抛出异常,但是一旦抛出异常只会抛出int类型。
如果抛出非int类型异常,调用unexsetpion()函数,退出程序。
C++11引入的关键字=default、=delete、override、final
=default
在C++11中,如果需要使用默认的构造、析构函数,需要在参数列表后面加上=default关键字,与之对应,如果你不想使用默认的构造、析构函数,就在参数列表后面加上=delete,这样编译器就会删除对应的默认构造、析构函数。
1
2
3
4
5
6
7
8
9
//demo.h
#pragma once
class CobjectA {
public:
CobjectA(int i);
CobjectA() = default;
};
再次编译输出:
1
Test Con !
这样可以看出,当我们需要使用编译器默认生成的构造函数,只需要在头文件声明的时候,在参数列表后加上关键字=default,不需要在对应的cpp文件中进行定义。
=delete
为了不让一个类被拷贝,可以将其拷贝构造函数声明为private属性,但是有了delete关键字后,可以直接在拷贝构造函数的参数列表后面加上=delete,对于一些不需要构造、析构函数的类,可以在其默认的构造、析构函数参数列表后加上=delete,减少生成可执行文件的体积。
override
在继承机制中会用到override关键字,使用该关键字可以避免一些低级错误的出现。例如,定义类A与类B,并让B继承A。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include
class A {
public:
virtual void func1()
{
std::cout << "class A func1" << std::endl;
}
};
class B : A {
public:
virtual void func1() override
{
std::cout << "class B func1" << std::endl;
}
};
int main()
{
A a;
a.func1();
B b;
b.func1();
return 0;
}
A中有虚函数func1,在B中继承后重新实现了一下,输出结果:
1
2
class A func1
class B func1
在B中改写func1,其后增加了override关键字,如果存在这样一种情况,本想改写从A中继承来的func1,由于疏忽,修改了函数的签名:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include
class A {
public:
virtual void func1()
{
std::cout << "class A func1" << std::endl;
}
};
class B : A {
public:
virtual void func2() override //将func1写成了func2
{
std::cout << "class B func2" << std::endl;
}
};
int main()
{
A a;
a.func1();
B b;
b.func2();
return 0;
}
结果编译出错:
1
2
3
test2.cpp:15:18: error: ‘virtual void B::func2()’ marked ‘override’, but does not override
15 | virtual void func2() override //将func1写成了func2
|
提示没有重写基类的方法,所以,有了override关键字,一定要重写基类的方法,这里的func2相当于是在类B中重新定义的一个函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include
class A {
public:
virtual void func1()
{
std::cout << "class A func1" << std::endl;
}
};
class B : A {
public:
virtual void func2() //这里去掉override关键字,相当于自己定义了一个func2函数
{
std::cout << "class B func2" << std::endl;
}
};
int main()
{
A a;
a.func1();
B b;
b.func2();
return 0;
}
输出结果:
1
2
class A func1
class B func2
- 《西游琉璃盏》2025年5月3日开启的“琉璃秘境探险之旅”盛大活动亲爱的《西游琉璃盏》玩家们,我们即将在2025年5月3日迎来一场前所未有的盛大活动——“琉璃秘境探险之旅”!这是一场充满挑战与机遇的冒...
- 三国志战略版兖州开荒转型攻略 黄月英关银屏张飞搭配攻略分享在《三国志战略版》的广袤战场上,由黄月英、关银屏和张飞组成的队伍,以其独特的配置和战术,成为了一股不容忽视的力量。尤其是在特定...
- 意外关闭WPS文档如何有效恢复未保存数据的实用方法如何恢复未保存的WPS文档数据在办公过程中,意外关闭WPS文档而未保存,常常让人感到无比沮丧。不过,不用担心,本文将教你几种有效的方法...
- 姑获鸟如何提升输出?姑获鸟如何提升输出? 网络 2025-10-14 22:10:22 11050 标题:姑获鸟输出技巧全解析:强化输出,掌控战场!一、被动技能的优化与利用1. 被动技能解...
- GT940显卡性能全面解析:优缺点对比及适用场景深度评测GT940显卡在电脑配件领域颇受瞩目,它具有鲜明的特点,既有优势也有不足,而且在不同应用场合中表现各异。接下来,我会具体阐述其性能表...
- 如何在 Psp 上下载游戏 ▷➡️Tecnobits - 视频 - 如何在psp上下载游戏 学习 在psp上下载游戏 对于这款标志性便携式游戏机的所有粉丝来说,这是一项必备技能。 PSP 自推出以来...
- 力量(状态效果)本条目介绍的是状态效果。关于魔咒,请见“力量(魔咒)”;关于其他含义,请见“力量”。 力量 [[|]][[|]][[|]][[|]] 颜色 #FFC700 类型 正面 即时...
- 《啪啪武将》五周年庆典:全服狂欢盛典暨新版本「三国乱斗」限时开启! 活动详情 活动时间:2025年5月30日 10:00 - 2025年6月13日 23:59 🎯 核心玩法 「名将擂台」:每日挑战历史名将,累计胜利可获得限定皮肤...
- 执剑江湖:2025年4月11日江湖争霸赛盛大开启,豪杰齐聚,剑指巅峰!亲爱的江湖侠士们,2025年4月11日,执剑江湖将迎来一年一度的江湖争霸赛!这是一场汇聚天下豪杰的盛事,也是一次展示你剑术与智慧的绝佳机...
- 王者荣耀怎么解压失败怎么回事 王者荣耀解压失败原因及解决方法解压失败原因分析《王者荣耀》作为一款备受欢迎的MOBA类手游,其更新和安装过程中偶尔会遇到解压失败的问题,这往往让玩家感到困惑和不安...