c++学习笔记(Day1)-- 数据类型


一.认识 C++

C++的特点

  • C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化 编程、面向对象编程和泛型编程

    动态类型:变量名绑定一种类型的对象后,在运行过程中可以随时改变。 静态类型:变量名在程序运行前就检查绑定类型,在运行期间类型不能改变(也可以理解为变量内存分配的动静态关系)。Java、C/C++、C# 等属于静态类型编程语言,而 Python、PHP、Perl 等属于动态类型语言。

  • 面向对象(OOP)开发的三大特性

    • 封装 、继承 、多态(有时候加上抽象称为四大特性)

    • 封装:黑盒特性,不关注内在属性和具体实现细节,只关注输入和输出。

    • 继承:在原有代码上增加少量变化修改,提高代码复用性。

    • 多态:多态性往往表现为"一个接口,多个功能",基于面向对象,提升代码的可扩展性。

  • 类、对象,属性、方法、即时变量:

    • 类:一些具有共同特征的事物的抽象模型。
    • 对象:对象是类的实例,即具有共同特征的某一具体实例。
    • 属性:对象的静态特征。
    • 方法:对象的动态行为。
    • 即时变量:对象的时间状态。
  • C++ 是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C++ 程序。

命名空间

命名空间:为了区分相同的变量或者函数,人为划分的范围标识符,也可以理解为调用的作用域。

C++从源码到可执行文件所经历的过程

image
过程

- 预处理阶段:对源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件。
- 编译阶段:将经过预处理后的预编译文件转换成特定汇编代码,生成汇编文件
- 汇编阶段:将编译阶段生成的汇编文件转化成机器码,生成可重定位目标文件
- 链接阶段:将多个目标文件及所需要的库连接成最终的可执行目标文件

C++ 标识符规则

  • C++ 标识符是用来标识变量、函数、类、模块,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。

  • C++ 标识符内不允许出现标点字符,比如 @、& 和 %。C++ 是区分大小写的编程语言。因此,在 C++ 中,Manpower 和 manpower 是两个不同的标识符。

关键字:

关键字(保留字)
image

二.C++ 数据类型

  • 数值型
    • 预定义类型(#define),整型、字符型、布尔型、浮点型、空类型,指针类型
类型 范围
char 1 个字节 -128 到 127 或者 0 到 255
unsigned char 1 个字节 0 到 255
signed char 1 个字节 -128 到 127
int 4 个字节 -2147483648 到 2147483647
unsigned int 4 个字节 0 到 4294967295
signed int 4 个字节 -2147483648 到 2147483647
short int 2 个字节 -32768 到 32767
unsigned short int 2 个字节 0 到 65,535
signed short int 2 个字节 -32768 到 32767
long int 8 个字节 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
signed long int 8 个字节 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long int 8 个字节 0 到 18,446,744,073,709,551,615
float 4 个字节 精度型占4个字节(32位)内存空间,+/- 3.4e +/- 38 (~7 个数字)
double 8 个字节 双精度型占8 个字节(64位)内存空间,+/- 1.7e +/- 308 (~15 个数字)
long double 16 个字节 长双精度型 16 个字节(128位)内存空间,可提供18-19位有效数字。
wchar_t 2 或 4 个字节 1 个宽字符
变量的大小会根据编译器和所使用的电脑而有所不同。
  • 自定义数据类型
    • 包含数组、结构体struct、联合体union、枚举enum、类;
  • typedef
    为一个已有的类型取一个新的名字(别名)。

大部分都和c语言相同,这里简要记录一下。

三.C++ 变量常量

变量

  • 声明和定义

      extern int d = 3, f = 5;    // d 和 f 的声明 
      int d = 3, f = 5;           // 定义并初始化 d 和 f
      byte z = 22;                // 定义并初始化 z
      char x = 'x';               // 变量 x 的值为 'x'
    

    extern:在单个文件中或者多个文件中使用(通常多文件),改变变量的作用域。一个变量可以声明多次,但只能定义一次

  • 左值(Lvalues)和右值(Rvalues)

    • 左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
    • 右值(rvalue):术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。

变量作用域

  • 局部变量
    在函数或一个代码块内部声明的变量,称为局部变量,它们只能被函数内部或者代码块内部的语句使用。
  • 全局变量
    在所有函数外部声明的变量,称为全局变量。全局变量可以被任何函数访问。也就是说,全局变量一旦声明,在整个程序中都是可用的。

注意:
在程序中,局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值
当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值

常量

  • 固有常量(常数值)
    像10、3.14159、true 、\a、‘a’、"hello, dear"等值,无法改变。

  • 定义常量

    • 使用 #define 预处理器。

         #define LENGTH 10   
         #define WIDTH  5
      

      在预处理阶段进行替换,需要注意替换后的优先级顺序。

         #define LENGTH a+b   
         #define WIDTH  c
         d=LENGTH*WIDTH;
      

      这里d=a+b*c,而不是想要的(a+b)*c。

    • 使用 const 关键字。

        const int  LENGTH = 10;
        const int  WIDTH  = 5;
      

      具有变量的属性,有数据类型,占用存储单元,有地址,可以用指针指向它。

    常量变量名一般定义为大写字母形式。

四.C++ 修饰符

数据类型修饰符

signed、unsigned、long 和 short 。

类型限定符

  • const: 类型的对象在程序执行期间不能被修改改变
  • volatile: volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。
  • restrict:用于告诉编译器,对象已经被指针所引用,不能通过除该指针外所有其他直接或间接的方式修改该对象的内容。

存储类修饰符

  • auto:在C++11中已删除这一用法。
  • register:定义存储在寄存器中而不是 RAM 中的局部变量。
  • static:修饰局部变量时,保持局部变量的值,而不需要在每次它进入和离开作用域时进行创建和销毁;修饰全局变量时,会使变量的作用域限制在声明它的文件内,只能在单文件内访问,与extern作用相反。
  • extern:用来在另一个文件中声明一个全局变量或函数。
  • mutable:仅用于类的对象。

五.C++ 运算符

算术运算符

+、-、*、/、%、++、--

关系运算符

>、<、==、>=、<=、!=

逻辑运算符

&&、||、!

位运算符

!、|、&、^、~、>>、<<

赋值运算符

=、+=...(组合赋值)

杂项运算符

运算符 描述
sizeof sizeof 运算符返回变量的大小。例如,sizeof(a) 将返回 4,其中 a 是整数。
Condition ? X : Y 条件运算符(三目表达式)。如果 Condition 为真 ? 则值为 X : 否则值为 Y。
, 逗号运算符会顺序执行一系列运算。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值
.(点)和 ->(箭头) 成员运算符用于引用类、结构和共用体的成员。
Cast 强制转换运算符把一种数据类型转换为另一种数据类型。例如,int(2.2000) 将返回 2。
& 指针(取址)运算符 & 返回变量的地址。例如 &a; 将给出变量的实际地址。
* 指针运算符 * 指向一个变量。例如,*var; 将指向变量 var。

六.C++ 三大结构

顺序结构

从前到后按顺序依次执行。

分支结构

  • if

  • switch

      switch(expression){
      	case constant-expression  :
      	   statement(s);
      	   break; // 可选的
      	case constant-expression  :
      	   statement(s);
      	   break; // 可选的
    
      	// 您可以有任意数量的 case 语句
      	default : // 可选的
      	   statement(s);
      }
    

    case 的 constant-expression 必须与 switch 中的变量具有相同的数据类型,且必须是一个常量或字面量
    不是每一个 case 都需要包含 break。如果 case 语句不包含 break,控制流将会 继续 后续的 case,直到遇到 break 为止

  • ? :

循环结构

  • while

  • for

      for ( init; condition; increment )
      {
         statement(s);
      }
    

    两个分号不可省略,三个表达式可以省略

  • do-while

  • 循环控制语句

    • break:遇见则跳出当前循环。
    • continue:遇见则略过本次循环的后续内容。
    • goto:无条件跳转(不建议使用)。

七.C++ 数字、数组、字符串

  • 赋值

      int a=10;
    
  • 数学计算
    引用数学头文件 <cmath>

序号 函数 & 描述
1 double cos(double);该函数返回弧度角(double 型)的余弦。
2 double sin(double);该函数返回弧度角(double 型)的正弦。
3 double tan(double);该函数返回弧度角(double 型)的正切。
4 double log(double);该函数返回参数的自然对数。
5 double pow(double, double);假设第一个参数为 x,第二个参数为 y,则该函数返回 x 的 y 次方。
6 double hypot(double, double);该函数返回两个参数的平方总和的平方根,也就是说,参数为一个直角三角形的两个直角边,函数会返回斜边的长度。
7 double sqrt(double);该函数返回参数的平方根。
8 int abs(int);该函数返回整数的绝对值。
9 double fabs(double);该函数返回任意一个浮点数的绝对值。
10 double floor(double);该函数返回一个小于或等于传入参数的最大整数。
  • 生成随机数
    关于随机数生成器,有两个相关的函数。一个是 rand(),该函数只返回一个伪随机数。生成随机数之前必须先调用 srand() 函数。

      #include <iostream>
      #include <ctime>
      #include <cstdlib>
    
      using namespace std;
    
      int main ()
      {
         int i,j;
    
         // 设置种子
         srand( (unsigned)time( NULL ) );
    
         /* 生成 10 个随机数 */
         for( i = 0; i < 10; i++ )
         {
      	  // 生成实际的随机数
      	  j= rand();
      	  cout <<"随机数: " << j << endl;
         }
    
         return 0;
      }
    

数组

  • 一维数组
    type arrayName [ arraySize ];

  • 二维数组
    type arrayName [ arraySize1][ arraySize 2];

  • 数组初始化

      指定长度
      double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
      不指定长度
      double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
      多维数组赋值
      int a[3][4] = {  
       {0, 1, 2, 3} ,   /*  初始化索引号为 0 的行 */
       {4, 5, 6, 7} ,   /*  初始化索引号为 1 的行 */
       {8, 9, 10, 11}   /*  初始化索引号为 2 的行 */
      };
      
      int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
    
  • 数组元素赋值与访问

      balance[4] = 50.0;
      double c=balance[4];
    

    除了初始化时候可以整体赋值,之后只能一个元素一个元素的赋值。
    数组元素的位置从0开始。

字符串

  • C语言类型的字符串

      char str[] = "string";
      字符串实际上是使用 null 字符 \0 终止的一维字符数组。实际长度比字符数多一。
      只能初始化时整体赋值,之后不行,比如:
      char str[];
      str = "string";
      这样是错误的。
    

    字符串操作函数:

      strcpy(s1, s2):复制字符串 s2 到字符串 s1。
      strcat(s1, s2):连接字符串 s2 到字符串 s1 的末尾。
      strlen(s1):返回字符串 s1 的长度。
      strcmp(s1, s2):如果 s1 和 s2 是相同的,则返回 0;如果 s1\<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0。
      strchr(s1, ch):返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
      strstr(s1, s2):返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。
    
  • c++的string类
    引用<string>,string类的特性:

         //变量声明
         string str1 = "runoob";
         string str2 = "google";
         string str3;
         int  len ;
    
         // 复制 str1 到 str3 
         str3 = str1;
         可以相互赋值,C语言字符串数组不行。
         赋值后长度可以发生变化,C语言字符则串必须先定义好长度。
        
         // 连接 str1 和 str2
         str3 = str1 + str2;
    
         // 求字符串长度
         len = str3.size();
         字符串长度为字符个数,不包括\0。
         
         //字符串比较
         str1==str2;str1>=str2;
         直接使用关系运算符比较字符串类。
         
         //字符串数组
         string strs[2]={"as","ssk"};
    
posted @ 2021-04-18 17:13  湮灭i  阅读(114)  评论(0编辑  收藏  举报