C++——入门基础语法

入门语法

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++的一些基础语法就介绍到这里了。

相关推荐
吾爱星辰1 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
ChinaDragonDreamer1 小时前
Kotlin:2.0.20 的新特性
android·开发语言·kotlin
IT良1 小时前
c#增删改查 (数据操作的基础)
开发语言·c#
小飞猪Jay2 小时前
C++面试速通宝典——13
jvm·c++·面试
Kalika0-02 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
_.Switch2 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
代码雕刻家2 小时前
课设实验-数据结构-单链表-文教文化用品品牌
c语言·开发语言·数据结构
一个闪现必杀技2 小时前
Python入门--函数
开发语言·python·青少年编程·pycharm
Fan_web2 小时前
jQuery——事件委托
开发语言·前端·javascript·css·jquery
龙图:会赢的2 小时前
[C语言]--编译和链接
c语言·开发语言