• [HQS]C++相关语法


    [HQS]C++相关语法

    一、C++新特性

    1、C语言不适合作为大型程序开发的编程语言;

    2、相比于C的新特性

    (1)命名空间
    (2)函数重载与运算符重载
    (3)引用
    (4)面向对象特性
    (5)泛型编程(模板编程)
    (6)STL标准库
    (7)异常处理;

    3、命名空间

    什么是命名空间:对于两个相同变量名的变量,画个圈,圈里的变量和圈外的变量互不干扰;
    怎么使用,‘::’;
    全局使用:using namespace ;
    (1)意义:为了解决合作开发时的命名冲突问题;
    #include<stdio.h"
    namespace  data{
    	int a=10;
    }
    int a=20;
    //::为域作用符,
    int a=20;
    int main()
    {
    	int a=30;
    	printf("%d\n",a);//打印a=30
    	printf("%d\n",::a);//打印全局变量
    	printf("%d\n",data::a);//打印data中的a
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    (2)语法:
    ①定义
    namespace <name>{
    //variable,class,function
    }
    
    • 1
    • 2
    • 3
    ②部分使用:::
    age 只能在本文件中使用
    namespace
    {
    	int age=11;
    }
    
    • 1
    • 2
    • 3
    • 4
    ③全部使用: using namespace ;
    在函数内使用时,表示命名空间的数据只在本函数内生效。
    #include
    #include
    #include
    
    namespace liu{
    	int age=24;
    }
    int main(int argc,const char *argv[])
    {
    	std::cout<<"hello world"<<std::endl;
    	using namespace liu;
    	std::cout<<age<<std::endl;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    ④匿名命名空间,只在本文件中使用,可以不用定义命名空间名称;
    #include
    #include
    #include
    namespace{
    int age=20;
    }
    
    int main(int argc,const char *argv[])
    {
    	std::cout<<age<<std::endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    ④取别名
    #include
    #include
    #include
    namespace name1{
    int age=20;
    }
    namespace naem2=name1;
    int main(int argc,const char *argv[])
    {
    	std::cout<<name2::age<<std::endl;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4、c++输入与输出

    (1)cin 输入流(解决scanf()缓冲区问题,对输入类型可以进行判断),输入成功返回1,输入错误返回0;
    1)cin.fail();//输入失败返回true,并把输入字符放回输入流,等待下次读取;
    2)cin.clear();//输入失败后,清除掉错误
    3)cin.ignore();//函数原型 istream &ignore(int n=1, int delim =EOF);此函数作用是跳过输入流中的n个字符,或者跳过delim 前面的所有字符,当为给函数传参数,等价于跳过一个字符;
    (2)cout 输出流
    #include
    using namespace std;
    int main(int argc, const char *argv[])
    {
    	int a=11;
    	cout<<"|";
    	cout.width(4);
    	cout<<a<<"|"<<endl;
    	///
    	//将数字以16进制输出:
    	cout<<hex<<a<<endl;
    
    	/
    	//将数字以8进制输出
    	cout<<oct<<a<<endl;
    
    	//
    	//showbase 显示前缀
    	cout<<showbase<<a<<endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    (3)标准错误流 cerr,以上均为对象,是类中早已定义好的,使用时需要包含头文件;
    (4)猜数字:在这里插入图片描述
    //猜数字
    
    • 1

    5、C++函数

    (1)带默认值的函数
    ①定义:定义函数时可以给形参指定一个默认值,如此做,在调用时未给该形参赋值,那么就使用该默认值;
    ②规则:
    1)默认参数只能放在形参列表的最后;
    2)一旦某个形参指定了默认值,那么它后面的所有形参都必须有默认值;
    3)实参和形参的传值是从左到右依次匹配的,默认参数的连续性是保证正确传参的前提;
    4)声明与实现只需要在其中一处进行默认参数说明,不需要两处都进行说明;
    (2)带占位参数的函数
    1)定义:C++中函数的形参列表可以有占位参数,用来作占位,调用函数时必须填补该位置。
    2)规则:
    ①只写类型不写变量名;
    ②若无默认值参数,则调用时必须填补;
    ③若有默认值参数,则调用时可以不用填补;
    (3)函数的重载
    1)定义:在同一作用域内,参数列别不同,函数名相同的函数,虽然函数名相同,但函数所在内存位置不同,本质上还是不同函数;
    2)规则:
    ①函数名必须相同;
    ②参数列表必须不同(个数不同,类型不同,参数列顺序不同等);
    ③函数的返回类型可以相同也可以不相同;
    ④仅仅返回类型不同不足以成为函数的重载;
    ⑤关于const ------- 需要根据具体形参含义进行确定;
    3)原理:在编译阶段函数会被重新命名,根据函数名、参数列表来决定,比如void Swap(int &a, int &b)在编译阶段的名称为_Swap_int_int;

    6、C++引用

    (1)定义:引用变量是一个别名,已存变量另外一个名字,同一块内存地址。
    (2)与指针的区别:①不存在空引用,引用必须连接到一块合法的内存;②一旦引用被初始化为一个对象,就不能被指向到另外一个对象,指针可以在任何时候指向到另一个对象;③引用必须在创建时被初始化,指针可以在任何时间被初始化。
    (3)规则:①<类型> &<引用名>=<目标名>;②引用必须在创建时被初始化,且初始化后不可以再指向其他目标名;③引用类型必须与目标类型一致;④不能将已有的引用名作为其他变量或对象的名字或者别名 ;
    (4)原理:使用引用时编译器会再底层生成一个指针,并进行指针操作,本质是 int *const p;
    #include
    using namespace std;
    int main()
    {
    	int a=10;
    	int &b=a;//不存在空引用,引用就立即被初始化为一个对象,不可再指向另外一个对象,
    	cout <<"a=" <<a <<"b="<<b<<endl;
    	
    }
    
    //int const *p;可以p= ,不能*p=;
    //int *const p;//*p可以改,p不能改;
    
    //交换两个数
    a=a^b;
    b=a^b;
    a=a^b;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    (5)用法:
    1)函数传参
    void Swap(int &a,int &b)
    {
    	int temp=a;
    	a=b;
    	b=tmp;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    2)函数返回值:返回的数据不可为局部变量;可以做左值,也可以做右值;
    3)对数组的引用
    int arr[5]={1,2,3,4,5};
    int (&refArr)[5]=arr;
    refArr[0]=6;
    cout<<"Arr[0]="<<arr[0]<<endl;
    
    • 1
    • 2
    • 3
    • 4
    4)对指针引用
    int num=100;
    int *ptr=&num;
    int *&refptr=ptr;
    
    *refptr=200;
    cout<<*ptr="<<*ptr<<endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    7、C++ new与delete

    (1)概念:①new,申请一块内存,并且初始化对象(底层使用malloc在堆区);②delete,释放一块内存,并且销毁对象;
    (2)new用法
    //申请一个对象
    int *a=new int(0);//int 为数据类型,0 为初值
    cout<<"a="<<*a<<endl;
    
    //申请一个对象数组
    int *arr=new int[5]();
    cout<<"arr[0]="<<arr[0]<<endl;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    (3)delete用法
    //销毁一个对象
    int *a=new int(0);
    cout << "a="<<*a<<endl;
    
    delete a;
    return 0;
    //销毁一个对象数组
    int *arr =new int[5]();
    cout << "arr[0]="<<arr[0]<<endl;
    delete []arr;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    (4)与malloc/free的区别
    1)new/delete 的实现时基于malloc/free;
    2)malloc/free 是C/C++标准库函数,new/delete是C++ 操作符;
    3)malloc /free 需要手动计算类型大小,且返回 void * ,new/.delete 可以自己计算类型大小,根据类型返回相应的类型的指针;
    4)malloc /free 只负责分配/释放空间,new/delete 会调用构造函数与析构函数,用于初始化对象与销毁对象;
    5)它们都是动态管理内存的入口,堆是一块具体区域内存,而自由存量区是一个抽象概念;
    //-std=c++11
    
    • 1

    8、C++bool类型

    bool类型只有两个取值,ture和false,true 表示真,false 表示假;
    C++中使用cout输出bool变量的值时还是用数字1和0表示,而不是true 或false;
  • 相关阅读:
    入手云服务器后,你需要做这些事【基于CentOS】
    TRITC-Streptavidin/TRITC-SA, 四甲基罗丹明标记链霉亲和素 Streptavidin-TRITC
    Linux:keepalived + ipvsadm
    景联文科技:提供通用多模态数据,助力AI多模态领域实现飞跃式发展
    Azkaban (二) --------- Azkaban 入门
    C++primeplusp(p356-386)
    Servlet 实现上传文件
    [仅需一步][org.eclipse.jgit]Java代码操作git命令的步骤...再也不用手写git命令了
    idea 提示Cannot resolve SpringBootApplication 是啥错
    RabbitMQ 消息应答与发布
  • 原文地址:https://blog.csdn.net/jun8086/article/details/127507472