美文网首页
C++关键字笔记

C++关键字笔记

作者: Catcola | 来源:发表于2020-10-13 20:00 被阅读0次

const:

所修饰的对象或变量不能改变,修饰函数时,该函数不能修改在函数外面声明的变量,也不能调用任何非const函数。在函数声明和定义时都要加上const,放在函数参数列表的最后一个括号后。


const_cast:

去除变量或对象的const限定,格式为const_cast<int *>(const_p)


dynamic_cast:

dynamic_cast用于类继承层次间的指针或引用转换。主要还是用于执行“安全的向下转型“。向上转型本身就是安全的。


enum:

enum(枚举)类型,给出一系列固定的值,只能在这里面进行选择一个。


explicit:

explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的。e.g., CxString(int size){size_ = size}允许CxString tmp = 10;这样子的构造等同于CxString tmp(10), 与CxString tmp = ”cc“;混淆。


export:

为了访问其他编译单元(如另一代码文件)中的变量或对象,对普通类型(包括基本数据类、结构和类),可以利用关键字 extern,来使用这些变量或对象时;但是对模板类型,则必须在定义这些模板类对象和模板函数时,使用标准 C++ 新增加的关键字 export(导出)。

e.g.

// out.h:(声明头文件——只包含out函数的声明信息)

template<class T> void out (const T& t);

// out.cpp:(定义代码文件——包含out函数的声明[通过include]和定义等全部信息)

#include <iostream>

#include “out.h”

export template<class T> void out (const T& t) {std::cerr << t;}

//user.cpp:(用户代码文件——包含函数的声明头文件后就可以使用该函数)

#include “out.h”

// 使用out()


extern: extern(外部的)声明变量或函数为外部链接,即该变量或函数名在其它文件中可见。被其修饰的变量(外部变量)是静态分配空间的,即程序开始时分配,结束时释放。

//在test1.h中有下列声明:

#ifndef TEST1H //防止头文件的重复引用

#define TEST1H

extern char g_str[]; // 声明全局变量g_str

#endif

// 在test1.cpp中

#include "test1.h"

char g_str[] = "123456"; // 定义全局变量g_str

//以上是test1模块, 它的编译和连接都可以通过,如果我们还有test2模块也想使用g_str,只需要在原文件中引用就可以了

#include "test1.h"

void fun2()    { cout << g_str << endl;    }


friend: 友元可以访问与其有 friend 关系的类中的 private/protected 成员,通过友元直接访问类中的 private/protected 成员的主要目的是提高效率。

https://www.cnblogs.com/honeybusybee/p/5259265.html


inline: 在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数。

e.g.

#include <stdio.h>

//函数定义为inline即:内联函数

inline char* dbtest(int a) {

    return (i % 2 > 0) ? "奇" : "偶";

}

int main(){

  for (i=1; i < 100; i++) {

      printf("i:%d    奇偶性:%s /n", i, dbtest(i));   

  }

}

在内部的工作就是在每个for循环的内部任何调用dbtest(i)的地方都换成了(i%2>0)?”奇”:”偶”,这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。

注意:  1. inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。

2. 内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。


mutable: 当类或者结构体中的某个变量被mutable关键字修饰时,即便这个结构体或者类被实例化为const类型,其中被mutable修饰的变量仍可以被修改。

e.g.,

typedef struct test {

    mutable int iVal = 0;

}Test;

int main() {

    const Test t;

    t.iVal = 2;

}


register: 当对一个变量频繁被读写时,需要反复访问内存,从而花费大量的存取时间。为此,C语言提供了一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,从而提高效率。

注意: 1. 只有局部变量才可以定义为寄存器变量

            2. 建议型关键字,同inline,实际编译的时候可以并未成为寄存器变量。


reinterpret_cast: 


static: 

运行一个完整的程序。我们可将整个存储区分为四块:

(1)栈区:就比如局部变量,对应的函数参数等这些,调用完之后相应的内存会自己释放掉,很让人省心。

(2)堆区:堆来堆去的。得要人动手。所以得我们自己手动去分配和释放。像malloc(c),new(c++) ,delete 一下等等。

(3)全局数据(静态区):全局变量和静态变量是放在一个窝里面的。静态变量如果没有初始化,系统会自动初始化的。虽然系统会自动初始化,但是分房间的时候还是得分清楚的。所以最终是初始化的全局变量和初始化的静态变量分在一块区域,即同一个房间。未初始化的全局变量和未初始化的静态变量分在一块。程序结束时释放。

(4)最后就是代码区了

static的用法:

(a)如果用static修饰局部函数的变量。那么这个变量就是静态变量了。在主函数中,如果重复调用这个函数,那么里面的这个静态变量只会初始化一次。如果没有用static修饰,那么每次调用的时候都会对这个变量进行初始化。

(b)如果用static修饰全局的变量。那么在这个文件中所有的函数都可以使用这个变量。如果一个工程里面有a.c和b.c文件,static在a.c中定义的。那么b.c就用不了这个static修饰的变量。如果没有static修饰,只要加一个extern外部调用声明,就可以了。

(c)如果用static修饰全局函数,同上(b)。

(d)static修饰类中的变量。用static修饰之后,那么这个变量的内存就分配在了全局数据区了,并不和该类在同一片区域。所以static只会被初始化一次。

(e)static修饰类中的函数。那么该函数就变成了静态函数。静态函数不能访问非静态函数,非静态函数可以访问静态函数。访问静态函数可以用(.->),指针或者类名::三种方式访问。


static_cast: 

static_cast < type-id > ( expression )

该运算符把 expression 转换为 type-id 类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:

① 用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。

② 用于基本数据类型之间的转换,如把 int 转换成 char,把 int 转换成 enum。这种转换的安全性也要开发人员来保证。

③ 把空指针转换成目标类型的空指针。

④ 把任何类型的表达式转换成void类。


union: 不同的是 enum 实质上是 int 类型的,而 union 可以用于所有类型。


virtual: 基类的函数调用如果有virtual则根据多态性调用派生类的,如果没有virtual则是正常的静态函数调用,还是调用基类的。

纯虚函数: virtual ostream& print( ostream&=cout ) const = 0;

包含一个或多个纯虚拟函数的类被编译器识别为抽象基类。抽象基类不能被实例化,一般用于继承。抽象基类只能作为子对象出现在后续的派生类中


volatile: 用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错

相关文章

  • C语言和C++的区别到底有多少?不要再傻傻分不清楚了

    1、关键字 蓝色标注为C语言关键字,C++继承了C语言的所有关键字,以下红色标注为C++中含有但C语言没有的关键字...

  • C++关键字笔记

    const: 所修饰的对象或变量不能改变,修饰函数时,该函数不能修改在函数外面声明的变量,也不能调用任何非cons...

  • c++第一讲

    目标 c++关键字 命名空间 c++输入和输出 缺省参数 函数重载 引用 内联 auto关键字 基于范围的for循...

  • C++学习笔记目录

    C++初步 C++数据长度 C/C++ 堆 栈 静态 常量 代码 区 static关键字 C++类和对象 C++引...

  • C++类、对象

    一、类 类(Class)则是C++面向对象编程的实现方式。class是C++关键字,也是用于类声明的关键字。紧接c...

  • C++关键字的思考 (Boolan)

    C++关键字的思考 (Boolan) 本章内容:1 关键字的相关理解1.1 const关键字1.2 static关...

  • 第一周(Geek Band)

    C++实现数据和函数的封装 C++面向对象(ObjectOriented) 基本格式 Inline内联函数关键字 ...

  • 【Swift 3 && C++11】<第一

    | Swift | C++:-:|:-:|:-:关键字 | let / var | const auto / au...

  • 2022-06-21

    C++入门基础知识 一、C++中总计有63个关键字: 其中画圈的是C语言的关键字。这里要注意了:false和tru...

  • 【Swift 3 && C++11】<第一

    |Swift|C++:-:|:-:|:-:用到的部分关键字|protocol,mutating, extensio...

网友评论

      本文标题:C++关键字笔记

      本文链接:https://www.haomeiwen.com/subject/ttuupktx.html