前言
C++是一种通用的编程语言,被广泛用于开发各种应用程序,包括系统软件、游戏、手机应用和高性能计算等。它是C语言的扩展,添加了许多新特性和功能,并支持面向对象编程。C++可以在不同的平台上编译和运行,具有高效性、可移植性和灵活性等特点。它的语法和语义与C语言相似,但还包括了类、模板、异常处理和STL(标准模板库)等特性。C++是一种强大而灵活的编程语言。简单的说,C++就是C语言的plus版本,C++的出现就是建立在C语言之上的。
一.命名空间
命名空间(Namespace)是一种组织和管理代码的方式,它将代码分组并提供了唯一的标识符(名称)来引用这些代码。它的主要作用是避免命名冲突,让不同模块或代码库中的同名元素能够被准确地引用。举个例子:
#include<stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
// 编译报错:error C2365: “rand”: 重定义;以前的定义是“函数”
printf("%d\n", rand);
return 0;
}
如果我把这个代码放到编译器里编译就会出现报错,说的是我们的rand重定义了。那是因为在头文件stdlib里我们有rand这个函数。这就是命名冲突了。
1.1namespace的价值
在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的就是对标识符的名称进行本地化,以避免命名冲突或名字污染,这时在我们的C++里面就引入了一个叫namespace的东西,在东西就可以很好的解决掉命名冲突的问题。
1.2namespace的定义
#include<stdio.h>
#include <stdlib.h>
namespace lwz
{
//在命名空间里可以是变量、函数和类型
int rand = 10;
int Add(int a, int b)
{
return a + b;
}
struct LNode
{
int* a;
struct LNode* next;
};
}
int main()
{
// 这里默认是访问的是全局的rand函数指针
printf("%p\n", rand);
// 这里指定lwz命名空间中的rand
printf("%d\n",lwz::rand);
return 0;
}
namespace a
{
namespace b
{
int Add(int x, int y)
{
return x + y;
}
}
namespace c
{
int Add(int x, int y)
{
return x + y;
}
}
}
int main()
{
printf("%d\n", a::b::Add(1, 2));
printf("%d\n", a::c::Add(2, 2));
return 0;
}
这里我在命名空间a里嵌套了两个命名空间b和c,在我们使用的时候,用::就可以访问命名空间里的东西了。
1.3命名空间的使用
namespace lwz
{
int a = 0;
int b = 10;
}
int main()
{
printf("%d\n", lwz::a);
printf("%d\n", lwz::b);
return 0;
}
namespace lwz
{
int a = 0;
int b = 10;
}
using namespace lwz;
int main()
{
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
using的作用就是展开我们的命名空间,可以理解为把lwz域里的东西拿到全局域里。当然也可以单独的把命名空间里的某个特殊成员展开。
namespace lwz
{
int a = 0;
int b = 10;
}
using lwz::a;
int main()
{
printf("%d\n", a);
printf("%d\n", lwz::b);
return 0;
}
二.输入输出
虽然C++是兼容C语言的,但是C++还是有自己的一套输入输出。我先简单的写一个输入输出:
#include<iostream>
using namespace std;
int main()
{
int a = 0;
double b=0.0;
char c = 'a';
std::cout << a << " " << b << " " << c <<std::endl;
//我们在输出时可以自动的识别变量的类型
cin >> a >> b >> c;
//输入1 2.222 x
cout << a << " " << b << " " << c << endl;
//输出1 2.222 x
return 0;
}
三.缺省参数
• 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。(有些地方把缺省参数也叫默认参数)
#include<iostream>
using namespace std;
void Func(int a = 0)
{
cout << a << endl;
}
int main()
{
Func(); // 没有传参时,使用参数的默认值
Func(10); // 传参时,使用指定的实参
return 0;
}
打印出的就是0 10.
• 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。
#include<iostream>
using namespace std;
void func1(int a=10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
void Func2(int a, int b = 10, int c = 20)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
func1();
func1(1);
func1(1, 2);
func1(1, 2, 3);
Func2(100);
Func2(100, 200);
Func2(100, 200,300);
return 0;
}
值得注意的是,在半缺省里,函数不可以是void Func2(int a=10, int b, int c = 20)或者void Func2(int a=10, int b, int)。
• 带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。
这里也就刚好对应上面的那一条,半缺省参数必须是从右往左依次连续缺省。
#pragma once
#include <iostream>
#include <assert.h>
using namespace std;
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top;
int capacity;
}ST;
void STInit(ST* ps, int n = 4);
此时我们已经在Stack.h文件里已经有了缺省参数,然后是.cpp文件:
#include"Stack.h"
void STInit(ST* ps, int n=10)
{
assert(ps && n > 0);
ps->a = (STDataType*)malloc(n * sizeof(STDataType));
ps->top = 0;
ps->capacity = n;
}
如果继续再函数定义这里还有缺省参数的话,就会导致重定义的问题出现。所以一定要是在函数声明给缺省值。
四.函数重载
4.1参数类型不同
#include <iostream>
#include <assert.h>
using namespace std;
int Add(int left, int right)
{
cout << "int Add(int left, int right)" << endl;
return left + right;
}
double Add(double left, double right)
{
cout << "double Add(double left, double right)" << endl;
return left + right;
}
int main()
{
Add(1, 2);
Add(1.23, 2.13);
return 0;
}
最终打印出“”
4.2参数个数不同
void f()
{
cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
int main()
{
f();
f(10);
return 0;
}
最后打印出:
4.3参数顺序不同
这个实际上也是参数类型不同
void f(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
cout << "f(char b, int a)" << endl;
}
最终打印出:
4.4其他情况
值得注意的是,返回值不同不能作为重载条件,因为调用的时候也无法区分。
包括还有一种情况也会报错:
void f1()
{
cout << "f()" << endl;
}
void f1(int a = 10)
{
cout << "f(int a)" << endl;
}
假如我调用的时候没有参数,编译器就不知道调用谁。
到这里我简单的介绍了几个简单的C++的语法,也是C++入门必须要知道的东西,如有错误还请多多指出,感谢观看。