目录
1. helloworld实现代码
展示的是C++语言的一个基本框架:
#include <iostream>
using namespace std;
int main(){
cout << "hello world" << endl;
return 0;
}
运行结果:
2. C++关键字
C++共有63个关键字,C语言有32个关键字,会在后面的学习中慢慢讲解。
3. 命名空间
3.1 问题引入
大家在学习中会看见这样一行代码:
#include <iostream>
类似于C语言中的:
#include <stdio.h>
这是用来控制程序的输入和输出的。
但是我们发现,还有这样一行代码:
using namespace std;
这里面包含几个关键字:using、namespace(这个就是命名空间),那么为什么存在命名空间?
我们清楚这样一个问题:
#include <stdio.h>
int a = 1;
int a = 0;
int main() {
printf("%d\n", a);
}
在全局变量中定义了两个变量a,那么在printf中输出的a就不明确是哪一个,于是就会造成名称冲突:
尤其是在小组分进行代码编写时,彼此不知道名称的使用,于是C++就引入了命名空间。
3.2 命名空间的定义
命名空间的定义需要使用到using、namespace关键字:
using namespace 空间名称 {
//相关内容
}
3.2.1 :: 域作用限定符
我们来看下面这段代码的输出结果是多少:
int a = 1;
int main() {
int a = 0;
printf("%d\n", a);
return 0;
}
注意,这个地方其实也存在命名冲突的情况,但是学习C语言我们知道,当变量名称相同的时候,局部优先。所以结果肯定是输出0:
但是如果确实有两个相同的a,一个是局部变量、一个全局变量,我想要访问全局变量怎么办?、
这时候就是要使用到 :: 作用域限定符,它的作用是从符号 :: 的左边寻找变量,如果左边为空则默认全局域。
#include <stdio.h>
int a = 1;
int main() {
int a = 0;
printf("%d\n", a);
printf("%d\n", ::a);
return 0;
}
我们来看运行结果就是:
3.2.2 命名空间的使用
命名空间的格式:
using namespace N1 //命名空间的名称
{
//命名空间之内可以定义变量,也可以定义函数
int a = 1;
int Add(int left,int right){
return left+right;
}
//也可以定义数据类型
struct ListNode{
int val;
struct ListNode* node;
}
}
这样我们就可以解决名称冲突的问题:
可以看见代码中,N1::a,这就是说,从N1域中找到变量a,同理N2::a就是从域N2中找到变量a。
3.2.3 命名空间的嵌套使用
命名空间也是可以嵌套使用的:
namespace N2 {
int a = 1;
int Add(int left,int right){
return left+right;
}
namespace N3 {
int Sub(int left,int right){
return left-right;
}
}
}
举个简单的例子来说明:
//命名空间还可以嵌套使用
namespace cxw
{
int c = 1;
namespace data
{
//数据组
int d = 5;
}
namespace cache
{
//缓存组
int e = 10;
}
}
要是用的话也是非常简单:
3.3 命名空间的使用方法
命名空间的使用方式有三种:
3.3.1 命名空间+作用域限定符
int main()
{
printf("%d\n", N::a);
return 0;
}
3.3.2 使用using将命名空间中的成员引用
namespace cxw
{
int c = 1;
namespace data
{
//数据组
int d = 5;
}
}
using cxw::c;
using cxw::data:;d;
int main (){
printf("%d\n",c);
printf("%d\n",d);
return 0;
}
3.3.3 使用using namespace将命名空间名称引入
namespace cxw
{
int c = 1;
namespace data
{
//数据组
int d = 5;
}
}
using namespace cxw;
//using namespace data;
int main (){
printf("%d\n",c);
//printf("%d\n",d);这句会报错,因为并没有开放命名空间data
return 0;
}
当然我们也可以在直接在main函数中引入命名空间的名称,能够做到防止全局污染。
4. C++的输入和输出
这里我们简单地学习一下C++中的输入和输出,后面还会详细地解释一下输入和输出流。
#include <iostream>
using namespace std;
int main()
{
cout << "hello world!" << endl;//换行符
return 0;
}
我们知道cout是输出、cin是输入,那么<<和>>又是什么呢?
<<是流插入运算符,>>是流提取运算符,endl是C++中的换行符,当然C语言中的“\n”也是可以用的。
输入流可以多个输入
说明:
使用cin(标准输入/键盘)、cout(标准输输出/控制台)时,必须要包含<iostream>的头文件,以及std标准命名空间的引入。在早期标准库中,是将所有的功能写在全局域,使用时只需要包含.h的头文件即可。但是后来将其实现在std 命名空间下,为了和 C 头文件区分,也为了正确使用命名空间,规定 C++ 头文件不带.h 。旧编译器 (vc 6.0) 中还支持 <iostream.h> 格式,后续编译器已不支持,因此 推荐 使用 <iostream>+std 的方式。
使用 C++ 输入输出更方便,不需增加数据格式控制,比如:整形 --%d ,字符 --%c
4.1 缺省参数
当声明或定义一个函数,这个函数需要传入参数时,如果没有参数的传入那么就是用默认的参数值,这个默认的参数值就叫做缺省参数值。
void TestFunc(int val=0) {
cout << val << endl;
}
int main() {
TestFunc();
TestFunc(2);
}
这段代码中第一个函数是没有进行传参的,这在C语言中肯定是错误的。但是在C++语言中,如果没有函数的传入就会使用缺省值。而如果有参数的传入,那就就以传入的参数为准。
4.2 缺省参数的分类
4.2.1 全缺省参数
全缺省
// 可以都不传,但是要传是从左往右传
void TestFunc(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
int main()
{
TestFunc();
TestFunc(1);
TestFunc(1,2);
TestFunc(1, 2,3);
return 0;
}
就是函数的每一个参数都有默认值,也就是说可以不用传入参数。但是如果要传入参数就必须要从左往右,不能够跳过a,然后传入b的值:
4.2.2 半缺省参数
void TestFunc(int a, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
int main()
{
TestFunc(1);
TestFunc(1, 2);
TestFunc(1, 2, 3);
return 0;
}
这段代码中a是没有默认值的,所以函数至少应该将a的值传入。
可以更严谨的说,半缺省参数必须要是参数列表从右往左连续提供
半缺省参数在栈中的灵活应用,在开辟栈的空间时,又默认值(比如4),没有参数值传入的话就是默认开辟4个空间,如果有参数传入的话就按照传入的具体值开辟空间。
struct Stack
{
int* a;
int size;
int capacity;
};
void StackInit(struct Stack* ps, int n = 4)
{
assert(ps);
ps->a = (int*)malloc(sizeof(int) * n);
ps->size = 0;
ps->capacity = n;
}
int main()
{
Stack st;
StackInit(&st, 100);
return 0;
}
5. 函数重载
5.1 函数重载的定义
函数重载是函数的一种特殊形式,C++中允许使用函数重载来描述功能类似的同名函数,要求同名函数的参数列表中的参数数量或参数类型或参数顺序不同(返回类型可以相同也可以不同),常用来解决数据类型不同的类似问题。
void Add(int a, double b) {
cout << a + b << endl;
}
void Add(double a, int b) {
cout << a + b << endl;
}
int main()
{
Add(3, 0.14);
Add(0.141, 3);
}
运行结果:
5.2 函数重载总结
满足下面至少一个条件:
- 参数类型不同
- 参数数量不同
- 参数顺序不同
(本篇完)