入门语法
C语言作为最基础最底层的语言,也是我们学习的第一门编程语言,但是它有许多不足,比如命名冲突等,C++很好的解决了这些不足。C++是在C语言的基础上不断增加新的语法,不断的加东西进而产生的一门语言,因此C++是源于C语言的。
1.C++关键字
C++在C语言基础上新增加了很多关键字,诸如class,inline,namespace等
如下图所示,这些关键字不需要刻意记忆,慢慢学下来就都记住了。
其中有一部分是C语言中有的关键字。
2.命名空间
命名空间是为了解决命名冲突产生的。
什么是命名冲突呢?
比如下面代码
c
#include<stdio.h>
#include<stdlib.h>
int rand = 10;
int main()
{
printf("%d", rand);
return 0;
}
rand是一个全局变量,运行结构应该是打印10,但是结果确实这样的
产生这样的原因是我们包含了stdlib.h的头文件,这个头文件里有一个rand函数,用来产生随机数的种子。此时rand作为函数名,而我们定义的rand和函数rand完全同名,就导致了这样的问题。在C语言里,解决办法就是将我们定义的变量名进行修改,但是在C++中,有了命名空间就不需要这样解决了。
命名空间的定义如下,namespace 加名称在加一对花括号即可,注意花括号结尾不需要分号。
namespace 名称{
}
先看一下这段代码
cpp
#include<iostream> //头文件
using namespace std; //展开命名空间
namespace T
{
void f()
{
printf("namespace T:f()\n");
}
}
void f()
{
printf("f()\n");
}
int main()
{
f();
T::f(); //指定到T这个命名空间找函数f
return 0;
}
以上两个函数同名,但是在不同的域里。所以可以同时存在。同名变量亦是如此。
打印结果如下图
一旦定义了命名空间,那么内部的变量和函数,将不能直接被访问,需要做以下任一操作才能访问
1.展开命名空间
在访问前加 using namespace 名称;即可
2.使用域作用限定符,指定访问,限定符由两个冒号组成
命名空间名称 : : 待访问成员
3.部分展开需要经常访问的变量或函数。
using 名称 : : 变量或函数名
将对以上情况一一举例。
操作一
操作二
操作三
变量如此,函数亦是如此。
命名空间如果同名怎么办?命名空间是支持嵌套的,在命名空间内可以定义变量,函数和其他命名空间。此外,如果在同一个文件内定义两个同名的命名空间,那么在编译时将自动合并在一起。
在日常练习和写题时,基本不会出现命名冲突的问题,但在做大型项目时,难免会出现。
命名空间解决了程序员和标准库的命名冲突,解决了程序员之间的命名冲突。
3.函数重载
这里先介绍下函数重载的概念。
两个或多个函数如果同名,且函数参数满足以下情形之一,即构成函数重载。
1 .参数类型不同
2 .参数个数不同
3 .参数类型顺序不同
此外,这些构成重载的函数可以出现在同一作用域。对以上三种情形分别举例。
情形一
情形二
情形三
C++支持函数重载的原因:函数名修饰规则。
在进行程序编译时,C++编译器会对函数名进行修饰,通过修饰后的函数名找到对应的地址,修饰规则根据系统有不同的差异。参数的个数以及类型会影响修饰后的函数名,进而找到不同的函数。
4.引用
引用就是对变量取别名。比如现实中的土豆,可以叫做马铃薯也可以叫做洋芋。都是指的一种蔬菜。
对已有的变量进行取别名操作时,需要用到一个符号(&)在C语言中,这个符号还可以用来取地址,或者按位与等操作,C++中还可以用来取别名。
比如下面这段代码。
cpp
int main()
{
int a = 10;
int& b = a;
int& c = b;
c++;
printf("%d %d %d", a, b, c);
return 0;
}
b和c是变量a的别名,那么对c进行++操作,也就相当于对a和b进行++操作。
打印结果是11,11,11
主要注意的是,引用的类型必须和引用实体类型一致。
引用还具有一些特性:1.定义引用时必须初始化;2.一个变量可以有多个引用;3.引用一旦定义,则不能修改引用实体。
了解了引用后,交换两数就又有了新的方法,如下
cpp
void swap(int& a, int& b)
{
int c = a;
a = b;
b = c;
}
int main()
{
int x = 10, y = 20;
swap(x, y);
printf("%d %d", x, y);
return 0;
}
a是x的引用,b是y的引用,在函数里交换了a和b的值,也就是交换了x和y的值。
对于常量值的引用需要特殊注意
cpp
int main()
{
const int a = 10;
int& b = a;//错误,a是常变量,不能修改,这种方式引用后,就可以修改了
const int& c = a;//正确
int& d = 10;//错误,10是常量
const int& e = 10;//正确
return 0;
}
这里会涉及读和写的权限的问题,权限只能缩小和平移,但是不能放大。比如只读不可写的值,在定义的引用是可读可写则权限放大,造成语法错误。
5.缺省参数
缺省参数是指在函数声明或定义时给函数的参数指定一个缺省值,在调用函数时如果没有指定实参,则形参使用该缺省值。
就比如这段代码
cpp
void f(int x = 1, int y = 2, int z = 3)
{
printf("%d %d %d\n", x, y, z);
}
int main()
{
f();
f(10);
f(10, 20);
f(10, 20, 30);
return 0;
}
这种情况属于全缺省,即所有参数都有缺省值。根据传参个数不同打印的结果也不同。
在函数传参时,必须从左到右依次传参,不能跳跃传参。
f(10, ,30);这种是错误的
另一种缺省为半缺省,注意半缺省不是指缺省一半,是指部分缺省。
部分缺省时需要从右往左缺省。如果从左往右缺省,在调用时会产生歧义
void f(int x=1,int y,int z=3);
上面函数的定义是错误的,当传两个参数时,可以对应x和y,也可以对应y和z
cpp
void f1(int x, int y, int z = 3)
{
printf("%d %d %d\n", x, y, z);
}
void f2(int x, int y = 2, int z = 3)
{
printf("%d %d %d\n", x, y, z);
}
对于f1传参时至少传两个参数,对于f2传参时至少传一个参数。
此外,缺省值需要是常量值或者全局变量。
对于C++的一些基础语法就介绍到这里了。