IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++ 函数后的关键字 -> 正文阅读

[C++知识库]c++ 函数后的关键字

c++ 函数后的关键字

C++函数后面加const关键字

  1. 非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用)
  2. 唯一的例外是对于mutable修饰的成员。
    加了const的成员函数可以被非const对象和const对象调用,但不加const的成员函数只能被非const对象调用
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,这样编译器就会删除对应的默认构造、析构函数。

//demo.h
#pragma once
class CobjectA {
public:
    
    CobjectA(int i);
    CobjectA() = default;
    
};

再次编译输出:

Test Con !

这样可以看出,当我们需要使用编译器默认生成的构造函数,只需要在头文件声明的时候,在参数列表后加上关键字=default,不需要在对应的cpp文件中进行定义。

=delete

为了不让一个类被拷贝,可以将其拷贝构造函数声明为private属性,但是有了delete关键字后,可以直接在拷贝构造函数的参数列表后面加上=delete,对于一些不需要构造、析构函数的类,可以在其默认的构造、析构函数参数列表后加上=delete,减少生成可执行文件的体积。

override

在继承机制中会用到override关键字,使用该关键字可以避免一些低级错误的出现。例如,定义类A与类B,并让B继承A。

#include <iostream>

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中继承后重新实现了一下,输出结果:

class A func1
class B func1

在B中改写func1,其后增加了override关键字,如果存在这样一种情况,本想改写从A中继承来的func1,由于疏忽,修改了函数的签名:

#include <iostream>

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;
}

结果编译出错:

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中重新定义的一个函数。

#include <iostream>

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;
}

输出结果:

class A func1
class B func2
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-17 11:49:20  更:2021-10-17 11:50:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:03:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码