• C++基础语法


    C++基础语法



    前言

    结合举例代码,快速理解使用C++语法…


    1. cout和cin

    cout输出cin是键盘输入
    在这里插入图片描述

    //i input 输入 o output输出 stream流 输入输出流头文件(类似stdio.h)
    2 #include <iostream>
    3
    4 //std(标准) 使用标准的命名空间using namespace std;//命名空间,此标识符作为此组群的名字
    5 using namespace std;
    6
    7 //有且只有一个主函数 可以有多个其他函数
    8 int main(int argc, char *argv[])
    9 {
    10 //cout 输出 类似 c语言的printf
    11 //endl 类似 c语言的 换行符
    12 // printf("Hello 你好!\n");
    13
    14 //cout代表的输出设备
    15 cout << "Hello 你好!" << endl;//将字符串输出到 控制台
    16
    17 //cin代表的是输入设备
    18 int num =0;
    19 cin >> num;//将建键盘输入的数据 赋值给 num
    20 cout<<"num = "<<num<<endl;
    21
    22 return 0;
    23 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    2. using namespace std;

    使用标准的命名空间std,std中所有成员名 可以直接使用,cout endl cin都是命名空间std的成员

     #include 
     using namespace std;
    
     int main(int argc, char *argv[])
     {
     std::cout << "Hello World!" << std::endl;
     cout << "Hello World!" << endl;
     return 0;
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3. 作用域 ::

    表明数据归属性,

    using namespace std;
    2 int a = 10;//全局变量
    3 void  main()
    4 {
    5 int a = 20;//局部变量
    6 cout<<"局部变量a = "<<a<<endl;//优先选择局部变量
    7
    8 //::作用域运算符(c++独有)
    9 cout<<"全局变量a = "<<::a<<endl;//取全局变量
    10 }`
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4.命名空间 namespace

    类似于C语言中的类定义,解决命名冲突;(快速开发,方便移植)

    1 //定义一个名字为A的命名空间(变量、函数)
    2 namespace A {
    3 int a = 100;
    4 }
    5 namespace B {
    6 int a = 200;
    7 }
    8 void main()
    9 {
    10 //A::a a是属于A中
    11 cout<<"A中a = "<<A::a<<endl;//100
    12 cout<<"B中a = "<<B::a<<endl;//200
    13 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.1命名空间可嵌套命名空间

    1 namespace A {
    2  int a = 1000;
    3  namespace B {
    4  int a = 2000;
    5       }
    6 }
    7 void main()
    8 {
    9    cout<<"A中的a = "<<A::a<<endl; //1000
    10   cout<<"B中的a = "<<A::B::a<<endl; //2000
    11 }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4.2命名空间是开放的,

    即可以随时把新的成员加入已有的命名空间中(常用)

    namespace A{
     int a = 100;
    
    }
    namespace A{
     int c = 200;
    }
    int main()
    {
        cout<<"a="<<A::a<<endl;
        cout<<"c="<<A::c<<endl;
         return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.3命名空间还可以存放函数

    1 namespace A {
    2 int a=100;//变量
    3
    4 void func()//函数
    5 {
    6 cout<<"func遍历a = "<<a<<endl;
    7 }
    8 }
    9 int main()
    10 {
    11 //变量的使用
    12 cout<<"A中的a = "<<A::a<<endl;
    13
    14 //函数的使用
    15 A::func();
    16 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4.4在外定义命名空间中的函数

    namespace A {
    2 int a=100;//变量
    3
    4 void func();
    5 }
    6
    7 void A::func()//成员函数 在外部定义的时候 记得加作用域
    8 {
    9 //访问命名空间的数据不用加作用域
    10 cout<<"func遍历a = "<<a<<endl;
    11 }
    12
    13 void funb()//普通函数
    14 {
    15 cout<<"funb遍历a = "<<A::a<<endl;
    16 }
    17 int main()
    18 {
    19 A::func();
    20 funb();
    21 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    4.5无名命名空间

    意味着命名空间中的标识符只能在本文件内访问,相当于给这个标识
    符加上了static,使得其可以作为内部连接

    1 namespace  {
    2 int a=100;//变量
    3
    4 void func()//函数
    5 {
    6 cout<<"holle world"<<a<<endl;
    7 }
    8 }
    9 int main()
    10 {
    11 //变量的使用
    12 cout<<"A中的a = "<<A::a<<endl;
    13
    14 //函数的使用
    15 func();
    16 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4.5给命名空间 取个别名

    namespace veryLongName{
    2
    3 int a = 10;
    4 void func(){ cout << "hello namespace" << endl; }
    5
    6 }
    7
    8 int main()
    {
    9 namespace shortName = veryLongName;
    10 cout << "veryLongName::a : " << shortName::a << endl;
    11 veryLongName::func();
    12 shortName::func();
    13 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    4.6优先使用命名空间

    using 使用命名空间

    1 namespace veryLongName {
    2 int a=100;
    3 void func(){cout<<"hello namespace"<<endl;}
    4 }
    5 int main()
    6 {
    8 //使用veryLongName命名空间
    9 using namespace veryLongName;
    10
    11 //出现的变量 从veryLongName命名空间中找 找不到 从其他地方中
    12 cout<<"a = "<<a<<endl;
    13 func();
    14 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.6using和局部变量的优先级

    当局部变量和命名空间重名的时候优先选择,只会选择局部变量

    1 namespace veryLongName {
    2 int a=100;
    3 void func(){cout<<"hello namespace"<<endl;}
    4 }
    5 int main()
    6 {
    7 int a=200;
    8 //使用veryLongName命名空间
    9 using namespace veryLongName;
    10
    11 //出现的变量 从veryLongName命名空间中找 找不到 从其他地方中
    12 cout<<"a = "<<a<<endl;//访问的是局部变量中的a
    13 cout<<"a = "<<veryLongName::a<<endl;//访问的是veryLongName的a
    14 func();
    15 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    5.bool型

    C++,中的bool类型,和51单片机中的,bit是一样的意思,
    bool类型只能对其赋值 false(0) 和 true(1);

    1 int main()
    2 {
    3 bool mybool;
    4 cout<<"sizeof(bool) = "<<sizeof(bool)<<endl;//1字节
    5 mybool = false;
    6 cout<<"false = "<<false<<endl;//0
    7 cout<<"true = "<<true<<endl;//1
    8 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    6.三目运算

    C++三目运算表达式返回值为变量的地址,而C语言是返回的变量存储值;

    1 int main()
    2 {
    3 int a = 10;
    4 int b = 20;
    5 cout<<"c++中:"<<(a>b?a:b)<<endl;
    6
    7 //a>b?a:b整体结果是变量本身(引用) 左值(能被赋值)
    8 a>b?a:b = 100;//b =100
    9 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    7. const修饰符

    code和const(都是只读变量)的区别。
    用code声明的对象会被编译器安排在ROM中,而ROM通常是只读的,无法更改。用const声明的对象可能会被安排在ROM中,但也可能在RAM中。如果在ROM中,当然不能修改了;如果在RAM中,理论上仍然可以修改,只是编译器不允许你去修改而已。const对象只能在声明时初始化一次。

    在C语言中
    const修饰全局变量num 变量名只读 内存空间在
    字常量区
    (只读)、不能通过指针获取num的地址 ,修改空间内容。局部变量可以,因为局部变量存储在栈区。

    1 //其他文件夹里的num进行声明(不要赋值)
    2 extern const int num;
    3
    4 int main()
    5 {
    6 printf("num = %d\n",num);
    7 //num = 200;//err num只读
    8
    9 //C语言中const 修饰变量名 说明变量名为只读(用户不能通过变量名data进行赋值)
    10 const int data = 100;//局部只读变量 内存在栈区(内存可读可写)
    11 //data = 200;//err
    12
    13 printf("data = %d\n",data);
    14 //但是:如果知道data的地址 可以通过地址间接的修改data所对应空间的内容
    15 int *p = (int *)&data;
    16 *p = 2000;
    17 printf("data = %d\n",data);//ok 200
    18 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在C++语言中
    const 修饰的变量不能被其.c和.h它文件引用,
    除非加上extern,在C++中定义的const型等于c语言中的#define,只是个常量,不能修改。
    除非是特殊方式定义,才能被修改。
    它的好处在于可以定义类型,可以放在名空间里定义方便代码的编写。

    1 //声明
    2 extern const int num;
    3 struct Person
    4 {
    5 int num;
    6 char name[32];
    7 };
    8 int main()
    9 {
    10 cout<<"全局num = "<<num<<endl;//err 不识别num
    11
    12 //1、c++中 对于基础类型 系统不会给data开辟空间 data放到符号表中
    13 const int data = 10;
    14 //data = 100;//err 只读
    15 cout<<"data = "<<data<<endl;
    16 //2、c++中当 对data 取地址的时候 系统就会给data开辟空间
    17 int *p = (int *)&data;
    18 *p = 2000;
    19 cout<<"*p = "<<*p<<endl;//空间内容修改成功 2000
    20
    21 cout<<"data = "<<data<<endl;//data 还是10为啥?
    22
    23 //2、当以变量的形式 初始化 const修饰的变量 系统会为其开辟空间
    24 int b = 200;
    25 const int a= b;//系统直接为a开辟空间 而不会把a放入符号表中
    26 p = (int *)&a;
    27 *p = 3000;
    28 cout<<"*p = "<<*p <<endl;//3000
    29 cout<<"a = "<<a <<endl;//3000
    30
    31 //3、const 自定义数据类型(结构体、对象) 系统会分配空间
    32 const Person per = {100,"lucy"};
    33 //per.num = 1000;//err
    34 cout<<"num = "<<per.num<<", name = "<<per.name<<endl;//100 lucy
    35 Person *p1 = (Person *)&per;
    36 p1‐>num = 2000;
    37 cout<<"num = "<<per.num<<", name = "<<per.name<<endl;//2000 lucy
    38 }
    
    • 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
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    8.引用

    在C++能用引用绝不用指针,给已有变量取个别名(不会再占用空间)

    1 int num = 10;
    2 int &a = num;//a就是num的别名 a==num,取地址int *a = #
    3
    4 cout<<"num = "<<num<<endl;//10
    5 //对a赋值 == 对num赋值
    6 a=100;
    7 cout<<"num = "<<num<<endl;//100
    8
    9 //a是num的别名 所以num和a具有相同的地址空间
    10 cout<<"a 的地址:"<<&a<<endl;
    11 cout<<"num 的地址:"<<&num<<endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    8.1引用给数组 取个别名

    1 int main()
    2 {
    3 int arr[5] = {10,20,30,40,50};
    4 //需求:给arr起个别名
    5 int (&my_arr)[5] = arr;//my_arr就是数组arr的别名
    6
    7 int i=0;
    8 for(i=0;i<5;i++)
    9 {
    10 cout<<my_arr[i]<<" ";
    11 }
    12 cout<<endl;
    13 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    8.2使用 typedef 取别名

    1 int main()
    2 {
    3 int arr[5] = {10,20,30,40,50};
    4 //1、用typedef 给数组类型 取个别名
    5 //TYPE_ARR就是一个数组类型(有5个元素 每个元素位int)
    6 typedef int TYPE_ARR[5];
    7
    8 //myArr就是数组arr的别名
    9 TYPE_ARR &myArr=arr;
    10
    11 int i=0;
    12 for(i=0;i<5;i++)
    13 {
    14 cout<<myArr[i]<<" ";
    15 }
    16 cout<<endl;
    17 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    Linux搭建Redis环境
    损失函数-交叉熵的原理及实现
    C# using()的本质
    华为认证云计算前景如何
    SpringMVC : 常用注解载入的方式和处理的方式
    Vue41 ref属性
    编程接口:eBPF 程序是怎么跟内核进行交互的?
    《C++ Primer》第3章 字符串、向量和数组(三)
    (yum+内网)centos7两种方式安装jdk11
    【动态顺序表实现-C++】
  • 原文地址:https://blog.csdn.net/weixin_46039185/article/details/128084542