C++知识回顾(前篇)

目录

  1. 1. 一、数据类型
    1. 1.1. 常规
    2. 1.2. typedef 声明
    3. 1.3. 枚举类型
  2. 2. 二、C++变量类型
  3. 3. 三、变量作用域
  4. 4. 四、C++常量
    1. 4.1. 整数常量
    2. 4.2. 浮点常量
    3. 4.3. 布尔常量
    4. 4.4. 字符常量
    5. 4.5. 字符串常量
    6. 4.6. 定义常量
  5. 5. 五、C++修饰符类型
  6. 6. 六、C++存储类
    1. 6.1. static 存储类
    2. 6.2. extern 存储类
    3. 6.3. mutable存储类
    4. 6.4. thread_local存储类
  7. 7. 七、运算符
    1. 7.1. 算术运算符
    2. 7.2. 关系运算符
    3. 7.3. 逻辑运算符
    4. 7.4. 位运算符
    5. 7.5. 其他运算符
    6. 7.6. C++中的运算符优先级
  8. 8. 八、循环
  9. 9. 九、判断、判断
  10. 10. 十、函数
  11. 11. 十一、数字
  12. 12. 十二、数组
  13. 13. 十三、字符串
    1. 13.1. 风格字符串
    2. 13.2. string类
  14. 14. 十四、C++指针
  15. 15. 十五、引用
    1. 15.1. 创建引用
  16. 16. 十六、时期&时间
  17. 17. 十七、基本的输入输出
  18. 18. 十八、C/C++数据结构
    1. 18.1. 指向结构的指针
    2. 18.2. typedef 关键字为结构体取别名

看了几天的C++资料,敲了不少代码,做个总结

一、数据类型

和C语言一样,C++支持C语言的数据类型,同时做了一部分扩展。

常规

布尔型:bool    一个字节
字符型:char    1个字节
整型:    int        4个字节
浮点型:float    4个字节
双浮点型:double    8个字节
无类型:void
宽字符型:wchar_t        等价 short int    typedef short int wshort_t    2或4个字节
类型范围
char1 个字节-128 到 127 或者 0 到 255
unsigned char1 个字节0 到 255
signed char1 个字节-128 到 127
int4 个字节-2147483648 到 2147483647
unsigned int4 个字节0 到 4294967295
signed int4 个字节-2147483648 到 2147483647
short int2 个字节-32768 到 32767
unsigned short int2 个字节0 到 65,535
signed short int2 个字节-32768 到 32767
long int8 个字节-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
signed long int8 个字节-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long int8 个字节0 到 18,446,744,073,709,551,615
float4 个字节精度型占4个字节(32位)内存空间,+/- 3.4e +/- 38 (~7 个数字)
double8 个字节双精度型占8 个字节(64位)内存空间,+/- 1.7e +/- 308 (~15 个数字)
long double16 个字节长双精度型 16 个字节(128位)内存空间,可提供18-19位有效数字。
wchar_t2 或 4 个字节1 个宽字符

typedef 声明

typedef type name 如:typedef int feet 那么就说明typedef有指代效果,这里便把feet指代int ,将类型名简化,可以新建一个变量:feet distance,整型变量distance。

枚举类型

枚举类型是C++中的一种派生数据类型,他是由用户定义的若干枚举常量的集合。如果变量只有几种可能的值,可以定义为枚举类型。
创建枚举采用关键词:enum

enum 枚举名{
    标识符[=整型变量],
    标识符[=整型变量],
    ...
}枚举变量;

如果枚举没有初始化,即省掉“=整型常量”时,则从第一个标识符开始。

enum color{red, green, blue}c;
c=blue;

默认情况下:第一个名称的值为0,第二个名称的值为1,第三个为2,…
enum color{red, green=5, blue};这里,blue的值为6,red的值为0。

二、C++变量类型

bool、char、int、float、double、void、wchar_t
、枚举、指针、数组、引用、数据结构、类

三、变量作用域

参考:1

  1. 局部变量 在函数或一个代码块内部声明的变量,称为局部变量
  2. 全局变量 在所有函数外部定义的变量(通常是在程序的头部),称为全局变量。全局变量一旦声明,在整个程序中都是可用的。
  3. 形式参数

同名变量,由于作用域的关系,结果也会不同。如:
`

int b = 2;
    {
        int b = 1;
        cout << "b = " << b << endl;    //b=1
    }
    cout << "b = " << b << endl;        //b=2

全局变量和和局部变量同名时,可通过域名在函数中引用到全局变量,不加域名解析则引用局部变量。

int a = 10;
int main()
{
    int a = 20;
    cout << ::a << endl;   // 10
    cout << a << endl;     // 20
    return 0;
}

全局变量可以在局部函数中重新赋值。

还有:静态全局变量、静态局部变量,命名前面加static..

四、C++常量

常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。

整数常量

十进制、八进制、十六进制的常量

212
215u
0xFeeL
078 //非法,8不是八进制的数字
032UU//非法,不能重复后缀
85        //十进制 
0213    //八进制 
0x4b    //十六进制 
30        //整数 
30u        //无符号整数
30l        //长整数
30ul    //无符号长整数 

浮点常量

浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。

3.14159        //合法
314159E-9L    //合法
510E    //非法,不完整的指数
210f    //非法,没有小数或指数
.e55    //非法,缺少整数或分数

布尔常量

ture代表真
false代表假
不应把true看成1,把false看成0。

字符常量

L开头,表示宽字符常量,存储在wchar_t类型的变量中,否则就是窄字符常量,存储在char类型的变量中。

在 C++ 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义

转义序列含义
\\\ 字符
\' ' 字符
\"" 字符
\?? 字符
\a警报铃声
\b退格键
\f换页符
\n换行符
\r回车
\t水平制表符
\v垂直制表符
\ooo一到三位的八进制数
\xhh . . .一个或多个数字的十六进制数

字符串常量

字符串字面值或常量是括在双引号””中的。

"hello, dear"

"hello, \
dear"

"hello,""d""ear"

定义常量

  1. 使用#define预处理器,宏定义,字符替换

     #include <iostream>
     using namespace std;
    
     #define LENGTH 10   
     #define WIDTH  5
     #define NEWLINE '\n'
    
     int main()
     {
    
        int area;  
    
        area = LENGTH * WIDTH;
        cout << area;
        cout << NEWLINE;
        return 0;
     }
     //结果为50,并回车
  2. 使用const关键字

     #include <iostream>
     using namespace std;
    
     int main()
     {
        const int  LENGTH = 10;
        const int  WIDTH  = 5;
        const char NEWLINE = '\n';
        int area;  
    
        area = LENGTH * WIDTH;
        cout << area;
        cout << NEWLINE;
        return 0;
     }
     //结果:50,并回车

注意:const定义之后,程序只能读取,不能对其赋值,仍然是一个变量,且不能被取消,#define只是替换,可以取消,使用undef参考

五、C++修饰符类型

六、C++存储类

static 存储类

static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。也就是说,存放地址不变,不能够立即被销毁,其大小还是可以变化,定义了一个静态变量

#include <iostream>

// 函数声明 
void func(void);

static int count = 10; /* 全局变量 */

int main()
{
    while(count--)
    {
       func();
    }
    return 0;
}
// 函数定义
void func( void )
{
    static int i = 5; // 局部静态变量
    i++;
    std::cout << "变量 i 为 " << i ;
    std::cout << " , 变量 count 为 " << count << std::endl;
}
//-------结果:------
变量 i 为 6 , 变量 count 为 9
变量 i 为 7 , 变量 count 为 8
变量 i 为 8 , 变量 count 为 7
变量 i 为 9 , 变量 count 为 6
变量 i 为 10 , 变量 count 为 5
变量 i 为 11 , 变量 count 为 4
变量 i 为 12 , 变量 count 为 3
变量 i 为 13 , 变量 count 为 2
变量 i 为 14 , 变量 count 为 1
变量 i 为 15 , 变量 count 为 0

extern 存储类

extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。

//第一个文件:main.cpp
#include<iostream>
int count;
extern void write_extern();
int main(int argc, char* argv[])
{
    count = 5;
    write_extern();

    return 0;
}
//第二个文件:support.cpp
#include<iostream>
extern int count;
void write_extern(void)
{
    std::cout<<"Count is "<<count<<std::endl;
}

mutable存储类

thread_local存储类

七、运算符

算术运算符

+ - * / % ++ --

关系运算符

== != > < >= <=

逻辑运算符

&&        与运算         并且         前后都满足 true
||      或运算        或者        满足一个 true
!        非运算        逆操作        true变false

位运算符

important

pqp & qp | qp ^ q
00000
01011
11110
10011
#include <iostream>
using namespace std;

int main()
{
   unsigned int a = 60;      // 60 = 0011 1100  
   unsigned int b = 13;      // 13 = 0000 1101
   int c = 0;           

   c = a & b;             // 12 = 0000 1100
   cout << "Line 1 - c 的值是 " << c << endl ;

   c = a | b;             // 61 = 0011 1101
   cout << "Line 2 - c 的值是 " << c << endl ;

   c = a ^ b;             // 49 = 0011 0001
   cout << "Line 3 - c 的值是 " << c << endl ;

   c = ~a;                // -61 = 1100 0011
   cout << "Line 4 - c 的值是 " << c << endl ;

   c = a << 2;            // 240 = 1111 0000
   cout << "Line 5 - c 的值是 " << c << endl ;

   c = a >> 2;            // 15 = 0000 1111
   cout << "Line 6 - c 的值是 " << c << endl ;

   return 0;
}

其他运算符

    sizeof                        sizeof(int)
condition ? x:y(条件运算符)     (a>b)?a:b     求最大值
    ,(逗号运算符)                i = (++i, i+100, 999+i)
. 和-> (成员运算符)        用于引用类、结构和共用体的成员
    Cast(强制转换符)            (int)2.20000
    &(指针运算符&返回变量的地址)        &a
    *(指针运算符*指向一个变量)            *a

C++中的运算符优先级

类别  运算符 结合性 
后缀 () [] -> . ++ - -   从左到右 
一元  + - ! ~ ++ - - (type)* & sizeof  从右到左 
乘除  * / % 从左到右 
加减 + -  从左到右 
移位  << >>  从左到右 
关系 < <= > >=  从左到右 
相等  == !=  从左到右 
位与 AND  从左到右 
位异或 XOR  从左到右 
位或 OR  从左到右 
逻辑与 AND &&  从左到右 
逻辑或 OR  ||  从左到右 
条件 ?:  从右到左 
赋值  = += -= *= /= %=>>= <<= &= ^= |= 从右到左 
逗号  从左到右 

八、循环

while 、for、 do…while 、嵌套

控制语句:break、 continue、go to

九、判断、判断

if语句、if…else语句、嵌套if、switch语句、嵌套switch语句

?:运算符

Exp1? Exp2:Exp3; 类比其他运算符里面的条件运算符。

十、函数

返回类型、函数名、参数、函数主体

十一、数字

十二、数组

C++数组

type arrayName[ arraySize ];

double a[10];

十三、字符串

风格字符串

起源于C语言,只是在末尾多加一个\0

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

等同于:char greeting[] = "Hello";

函数:strcpystrcatstrlenstrcmpstrchrstrstr

string类

头文件:string


#include <iostream>
#include <string>

using namespace std;

int main ()
{
   string str1 = "Hello";
   string str2 = "World";
   string str3;
   int  len ;

   // 复制 str1 到 str3
   str3 = str1;
   cout << "str3 : " << str3 << endl;

   // 连接 str1 和 str2
   str3 = str1 + str2;
   cout << "str1 + str2 : " << str3 << endl;

   // 连接后,str3 的总长度
   len = str3.size();
   cout << "str3.size() :  " << len << endl;

   return 0;
}
输出结果:
str3 : Hello
str1 + str2 : HelloWorld
str3.size() :  10

十四、C++指针

十五、引用

  • 不存在空引用。引用必须连接到一块合法的内存。
  • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
  • 引用必须在创建时被初始化。指针可以在任何时间被初始化。

创建引用

int i = 17;
int& r = i;
double &s = d;

十六、时期&时间

十七、基本的输入输出

  1. I/O库头文件

  2. 标准输出流cout

  3. 标准输入流cin

  4. 标准错误流cerr

  5. 标准日志流clog

十八、C/C++数据结构

结构体

struct type_name{            //type_name是结构体类型的名称,类比int
    member_type1 member_name1;
    member_type2 member_name2;
    member_type3 member_name3;
    ...
}object_names;            //object_names:变量名
struct books{
    char title[50];
    char author[50];
    char subject[100];
    int book_id;
}book;

访问结构成员采用.

book.title = "红楼梦";

// 声明一个结构体类型 Books 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

int main( )
{
   Books Book1;        // 定义结构体类型 Books 的变量 Book1
   Books Book2;        // 定义结构体类型 Books 的变量 Book2

指向结构的指针

struct Books * struct_pointer;

访问变量Book1,可以这样,将struct_pointer指向它。struct_pointer = &Book1;

访问变量里面的成员可以:struct_pointer->title,也可以Book1.title

typedef 关键字为结构体取别名

typedef struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
}Books;
...

Books book1, Book2;

也可以定义非结构体类型:

typedef long int * pint32;
...
pint32 x, y, a;