目录
1、关键字
2、C++输入流&输出流
3、命名空间
3.1 命名空间的定义
3.2 命名空间的使用
1、采用命名空间名称及作用域限定符
2、使用using将命名空间中成员引入
3、使用using namespace将命名空间展开
4、使用命名空间的建议
4、缺省参数
4.1 全缺省参数
4.2 半缺省参数
4.3 缺省参数在栈中的运用
4.4 缺省参数使用注意事项
5、总结
C++关键字总计有63个,C语言有32个关键字。这些关键字不会在本文一一讲解,列出的目的是为了让读者们能对C语言和C++的关键字组成有一定的认识,最终这些关键字我会在后面的文章中陆续涉及并讲解,那样读者们才能针对具体场景并有了一定基础以后,理解得更深刻,也更具有意义。
asm | do | if | return | try | continue |
auto | double | inline | short | typedef | for |
bool | dynamic_cast | int | signed | typeid | public |
break | else | long | sizeof | typename | throw |
case | enum | mutable | static | union | wchar_t |
catch | explicit | namespace | static_cast | unsigned | default |
char | export | new | struct | using | friend |
class | extern | operator | switch | virtual | register |
const | false | private | template | void | true |
const_cast | float | protected | this | volatile | while |
delete | goto | reinterpret_cast |
C++这里所指的输入流和输出流的作用同C语言中的scanf函数和printf函数一样,下面先带大家用代码比较着理解:
通过上图提供的代码对比,可以看出,在C++中有自己独特的风格,C语言大家已经很熟悉了,下面我重点介绍C++的输入流和输出流:
1、cout:表示控制台标准输出。其作用同printf函数一样,都是不同语言对应的标准输出,通俗来讲就是我们可以在屏幕上观察我们想要的结果;
2、<<:流插入运算符。可近似理解成将变量从屏幕中打印出来,从运算符的右向左理解;
3、endl:表示换行符,和C语言中的'\n'的功能一致;
4、cin:表示控制台标准输入。其作用同scanf一样,可以从键盘上输入指定的数据、字符等;
5、>>:流提取操作符。可近似理解成将键盘输入的内容到指定变量中,从运算符的左向右理解。
除此以外,C++的输入输出流需要包含头文件:#include
另外值得大家注意的就是,C++中相比C语言输入输出更方便,不需要考虑数字格式,语言本身会自动识别。比如%d--整型;%c--字符型等。
在C/C++中,变量、函数和C++中特有的类等都是大量存在的,这些变量、函数和类的名称都将存在于全局作用域中,可能会导致很多冲突。C++中使用命名空间的目的就是对标识符的名称进行本地化,以避免命名冲突或名字污染。
C++中的关键字namespace就是针对这一问题而出现的,下面带着大家重点学习。
关键字:namespace + 用户自定义的命名空间名称,然后接一对“ {} "即可。" {} "中为命名空间的成员。
namespace King_lm_Guard // King_lm_Guard为命名空间的名称
{
// 命名空间中的内容,既可以定义变量,也可以定义函数
int a;
int Add(int left, int right)
{
return left + right;
}
//命名空间嵌套调用
namespace N1
{
int c;
int d;
int Sub(int left, int right)
{
return left - right;
}
}
}
//允许同名空间
namespace King_lm_Guard
{
int Mul(int left, int right)
{
return left * right;
}
}
如上述程序所示," {} "中可以定义变量、可以定义函数,也可以将命名空间嵌套调用,并且,在同一个项目中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间处理
如下图所示,因为rand函数在C++中已经定义过了,所以如果我们需要采用这一名称,则需要采用命名空间附加定义。
在下图的程序中可以看到:使用namespace创建了命名空间zk,然后在其空间内部重定义了rand,为了大家理解,因为C++兼容C语言语法,所以我就先采用printf函数打印rand,会发现第一个printf打印的值不是我们想要的,这是因为我们自己定义的rand的作用域只在zk内,出了该作用域就不可以了,为此此时打印的值是C++中已经定义的rand,所以打印出来的不是我们想要的
而第二个printf打印的时候,我在程序中使用了" zk::rand ",此时打印出来的就是我们想要的结果,这种程序书写格式就是命名空间使用的方法之一,“ :: ”是作用域限定符。
namespace zk
{
int rand = 0;
}
int main()
{
printf("%d\n", rand);
printf("%d\n", zk::rand);
return 0;
}
using N::a | 该功能可将常用的变量函数等展开,比如:using std::cout;using std::cin; |
using N::b;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
return 0;
}
using namespce N;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
Add(10, 20);
return 0;
}
补充:C++的所有变量都在命名空间" std "中,比如第二讲关于C++的输入流和输出流,使用的cout、cin、endl等都是属于这个空间中的内容,读者们可以发现我在前面使用的时候采用了第3种方法,即将std完全展开使用,下面我将前面的3种方法都演示一遍。
缺省参数是申明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。
//缺省参数
using namespace std;
//为函数的参数指定一个默认值
void Func(int a = 0)
{
cout << a << endl;
}
int main()
{
//没有为函数传参时,使用参数的默认值,即a=0;
Func();
//指定参数传参时,则使用指定的实参
Func(10);
}
//全缺省参数:即函数需要指定的参数组成全部都设置有默认值
void TestFunc(int a = 10,int b=20,int c=30)
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "c=" << c << endl << endl;
}
int main()
{
//传参时必须从左向右给值
TestFunc();
TestFunc(1);
TestFunc(1,2);
TestFunc(1, 2, 3);
return 0;
}
//半缺省参数:指缺省部分参数
//缺省参数必须从右往左连续缺省,不能间隔
void TestFunc1(int a, int b = 20, int c = 30)
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "c=" << c << endl << endl;
}
int main()
{
TestFunc1(1);
TestFunc1(1,2);
TestFunc1(1, 2,3);
return 0;
}
在以前我们写顺序表或者栈的时候,需要扩容,所以我们需要预先开辟一定的空间,在这里不懂顺序表的读者们可以阅读我前段时间写的一文线性表—顺序表相关知识点讲解(关于栈的使用我后面将会在数据结构与算法专栏中抽时间跟上),因为涉及到扩容,初始化的时候我们可以自定义扩容一定的空间,比如16个字节的空间等,但这种方式仍然会有一定的不足,于是在这里,因为使用了C++,所以我们可以利用缺省参数的功能。
同样我们可以预先给定一个初始值,如程序中的capacity=4,但当我们在使用栈时已经确定会插入一定的数据量,比如1000个整型,那我们可以直接传参,这样就可以减少不够在扩容,不够再扩容的行为,因为每一次扩容计算机的运行速度会下降,利用缺省参数可以极大地提高计算机处理效率。
//缺省参数在栈中的运用
struct Stack
{
int*a;
int top;
int capacity;
};
void StackInit(struct Stack*ps, int capacity = 4)
{
ps->a = (int*)malloc(sizeof(int)*capacity);
ps->top = 0;
ps->capacity = capacity;
}
int main()
{
//当知道一定会插入100个数据,就可以显示传参数100;
//利用缺省参数,提前开辟默认空间,插入数据避免扩容
struct Stack st1;
//StackInit(&st1, 100);
StackInit(&st1);
return 0;
}
1、全缺省参数要保证从左向右给值;
2、半缺省参数必须从右向左依次来给出,不能间隔着给值;
3、缺省参数不能在函数声明和定义中同时出现,分离定义时,声明给出缺省参数,如果缺省参数不在函数声明中给出,而是在函数定义中给出,则不起作用。
今天这一讲是C++基础篇的第一讲,我将基于C语言,将C++扩充的基础概念先带大家熟悉,这样便于后面带着大家学习C++的类和对象,由于时间有限,C++剩下的基础概念在后面的章节中陆续整理出来。欢迎大家点赞、支持、关注!!!