目录
C++的输入输出:
输入:
int a;
char c;
std::cin >> a >> c; //可以自动识别参数类型
输出:
int a=10;
char c=x;
std:: cout << a << " " << c << endl; //cout即输出到控制面板
(输出10 x)
endl为end line(换行的缩写)
命名空间域:
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
使用:
namespace XXX
{
//在这里面的命名可以是函数名之类的例如rand
}
注意:
如果存在两个相同命名的命名空间域会自动合并。
c++的标准库放在std(standard)的命名空间里的
对于使用命名域里的我们通常有以下三种方式
1:每次调用时到它的命名域中找
std::cout << "hellow world" << endl;
2:将某一项展开
using std::cout
.......
cout << "hellow world" << endl;
3:全部展开
using namespace std
......
cout << "hellow world" << endl;
缺省(默认)参数:
在函数的定义或声明时候对函数的参数给一个值作为默认值,当我们调用此参数的时候若没有进行传参那么就使用默认参数。
void func(int a = 10)
{
return a*a;
}
int main()
{
int a=5;
int b=fun(); //没有传参默认值为10,所以b=100;
int c=fun(a); //给了参数5,c=25;
return 0;
}
注意:
1:缺省分为半缺省和全缺省
int fun1 (int a,int b=10,int c=10) //半缺省
{
return a+b+c;
}
int fun2 (int a=10,int b=10,int c=10) //全缺省
{
return a+b+c;
}
2:带缺省的函数必须从左到右依次给实参不能跳跃给实参
int fun1 (int a,int b=10) //正确
{
return a+b;
}
int fun1 (int a=10,int b) //错误
{
return a+b;
}
函数重载:
C++允许在同一作用域中出现同名函数,但是要求形参不同。
int add(int a,int b)
{
return a+b;
}
float add(float a,float b)
{
return a+b
}
这可以让一个函数表现出多态性,使用更加灵活。
注意:
1:可以是函数形参个数不同。
2:可以是函数形参类型不同。
3:可以是函数形参先后顺序不同。
void fun(int a,char c);
void fun(char c,int a);
.......
引用:
引用是对一个已经存在的变量起别名,内存不会为其单独开辟空间而是与引用对象共同使用一块空间。一个对象可以有多个别名,别名也可以有别名。当别名改变时引用对象也改变。
int a=0;
int& b=a;
int& c=a;
int& d=a; //abcd都为0
++d; //abcd都为1
//abcd的地址都是一样的
用处:
因为引用就是引用对象本身,于是如果对于一些函数的形参使用引用的结构就在去改变形参那么就可以实现不需要通过指针的方式改变实参。
void Swap(int& rx,int& ry)
{
int tmp=rx;
rx=ry;
ry=tmp
}
int main()
{
int a=10;
int b=0;
Swap(a,b) //不用传指针
}
const引用:
对于引用前加const的情况:
1:对于const的变量或者常量进行引用时
const int a=1;
int& pa=a; //这种写法是错误的,不能进行权限放大(原本是不可修改的变量)
const int& pa=a; /正确的
2 :const可以进行权限缩小
int a=1;
const int& pa=a; //pa不可改变(权限缩小只读不写)
3:在产生中间变量的时候
int a=1;
const int b=2;
double f=13.14;
const int& sum=(a+b); //a+b的结果会产生一个临时变量存储,临时变量有常性所以引用要加const
const int& pf=f; //f引用为整形会存在类型转换取出整数部分用临时变量存储,具有常性
4:在某些函数中
在传地函数中,由于形参是实参的拷,拷贝需要消耗空间和效率,于是我们可以直接通过在函数内为实参引用但是由于我们不想改变实参数或者类型不一样等原因我们就加上const。
内联函数inline:
概念:
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调
用建立栈帧的开销,内联函数提升程序运行的效率。
特性:
1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会
用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运
行效率。
2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建
议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不
是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。下图为
《C++prime》第五版关于inline的建议
3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址
了,链接就会找不到。
指针空值nullptr:
NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何
种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:
void f(int)
{
cout<<"f(int)"<<endl;
}
void f(int*)
{
cout<<"f(int*)"<<endl;
}
int main()
{
f(0);
f(NULL);
f((int*)NULL);
return 0;
}
程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的
初衷相悖。
在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器
默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void
*)0。
注意:
1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入
的。
2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。