[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);
printf("%d\n",::a);
printf("%d\n",data::a);
}
(2)语法:
①定义
namespace <name>{
}
②部分使用:::<variable/function/class>
age 只能在本文件中使用
namespace
{
int age=11;
}
③全部使用: using namespace ;
在函数内使用时,表示命名空间的数据只在本函数内生效。
#include<iostream>
#include<stdio.h>
#include<cstdio>
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;
}
④匿名命名空间,只在本文件中使用,可以不用定义命名空间名称;
#include<iostream>
#include<stdio.h>
#include<cstdio>
namespace{
int age=20;
}
int main(int argc,const char *argv[])
{
std::cout<<age<<std::endl;
return 0;
}
④取别名
#include<iostream>
#include<stdio.h>
#include<cstdio>
namespace name1{
int age=20;
}
namespace naem2=name1;
int main(int argc,const char *argv[])
{
std::cout<<name2::age<<std::endl;
}
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<iostream>
using namespace std;
int main(int argc, const char *argv[])
{
int a=11;
cout<<"|";
cout.width(4);
cout<<a<<"|"<<endl;
cout<<hex<<a<<endl;
cout<<oct<<a<<endl;
cout<<showbase<<a<<endl;
return 0;
}
(3)标准错误流 cerr,以上均为对象,是类中早已定义好的,使用时需要包含头文件;
(4)猜数字:
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<iostream>
using namespace std;
int main()
{
int a=10;
int &b=a;
cout <<"a=" <<a <<"b="<<b<<endl;
}
a=a^b;
b=a^b;
a=a^b;
(5)用法:
1)函数传参
void Swap(int &a,int &b)
{
int temp=a;
a=b;
b=tmp;
}
2)函数返回值:返回的数据不可为局部变量;可以做左值,也可以做右值;
3)对数组的引用
int arr[5]={1,2,3,4,5};
int (&refArr)[5]=arr;
refArr[0]=6;
cout<<"Arr[0]="<<arr[0]<<endl;
4)对指针引用
int num=100;
int *ptr=#
int *&refptr=ptr;
*refptr=200;
cout<<*ptr="<<*ptr<<endl;
7、C++ new与delete
(1)概念:①new,申请一块内存,并且初始化对象(底层使用malloc在堆区);②delete,释放一块内存,并且销毁对象;
(2)new用法
int *a=new int(0);
cout<<"a="<<*a<<endl;
int *arr=new int[5]();
cout<<"arr[0]="<<arr[0]<<endl;
(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;
(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)它们都是动态管理内存的入口,堆是一块具体区域内存,而自由存量区是一个抽象概念;
8、C++bool类型
bool类型只有两个取值,ture和false,true 表示真,false 表示假;
C++中使用cout输出bool变量的值时还是用数字1和0表示,而不是true 或false;