从0开始c++入门

c++入门

1.命名空间

1.1
在c语言中会发生命名冲突,这是因为大量的变量名,函数名存在于全局作用域,
可能会导致很多冲突。但c++中的namespace关键字的出现就是针对这种问题的。
例如在c语言中:

 #include<stdio.h>
#include<stdlib.h>
int rand = 10;
// error C2365: “rand”: 重定义;以前的定义是“函数”
int main()
{
	printf("%d", rand);
	return 0;
}
   

1.2namespace的定义
定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。
c++中有局部域,全局域,命名空间域,类域。局部域和全局域除了会影响
编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期

#include<stdio.h>
#include<stdlib.h>
//int rand = 10;
// error C2365: “rand”: 重定义;以前的定义是“函数”

namespace LL
{
	int rand = 10;
}

int main()
{
    printf("%p\n", rand);
	printf("%d", LL::rand);
	return 0;
}


可以看到第一个rand是全局默认的函数,第2个是命名空间中的整数
有3个注意点
1.namespace只能定义在全局,可以嵌套。
2.多文件中同名的namespace认定为一个namespace,不会冲突。
3.C++标准库都放在⼀个叫std(standard)的命名空间中。

1.3命名空间的使用
1.编译查找一个变量的声明/定义时,默认只查找全局域,局部域,不会在命名空间中查找。所以下面的程序会报错。

#include<stdio.h>
namespace LL
{
	int a;
	int b;
}
//error C2065: “a”: 未声明的标识符
int main()
{
	printf("%d\n", a);
	printf("%d\n", b);
}

所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:
• 指定命名空间访问,项⽬中推荐这种⽅式
• using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。
• 展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。
1.指定命名空间查找
在这里插入图片描述
2.将命名空间中某个成员展开
在这里插入图片描述
3.展开空间中的所有成员
在这里插入图片描述

2.c++的输出与输入

'‘iostream’'是InputOutputStream的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输出对象。
这里有关类的知识先跳过,只简单介绍一下用法

#include <iostream>
using namespace std;
int main()
{
int a = 0;
double b = 0.1;
char c = 'x';
cout << a << " " << b << " " << c << endl;
std::cout << a << " " << b << " " << c << std::endl;
return 0;
}

在这里插入图片描述
cin是输入,cout是输出,可以自动识别类型

3.缺省参数

1.缺省参数是定义/声明是设定函数时的缺省值(默认值),在传参时不传参数会使用缺省值
2.缺省参数分为全缺省,半缺省参数。c++规定半缺省必须从右往左依次连续缺省,不能眺越给缺省值。
3.调用带缺省参数的函数时给实参必须从左往右,不能跳跃给实参。
4.函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。
1

#include<iostream>
#include<assert.h>
using namespace std;

void fune(int a = 0)
{
	cout << a << endl;
}

int main()
{
	fune();// 没有传参时,使⽤参数的默认值
	fune(10);// 传参时,使⽤指定的实参
	return 0;
}

在这里插入图片描述
2 3

#include<iostream>
#include<assert.h>
using namespace std;
//全缺省
void fune1(int a = 10, int b = 100, int c = 1000)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}
//半缺省
void fune2(int a, int b = 100, int c = 1000)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

int main()
{
	fune1(0);
	fune1(1);
	fune1(1,2);
	fune1(1, 2, 3);
	cout << endl;
	fune2(1);
	fune2(1,2);
	fune2(1, 2, 3);
	return 0;
}

在这里插入图片描述
4.在函数声明中定义缺省参数

// Stack.h
#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.cpp
#include"Stack.h"
// 缺省参数不能声明和定义同时给
void STInit(ST* ps, int n)
{
assert(ps && n > 0);
ps->a = (STDataType*)malloc(n * sizeof(STDataType));
ps->top = 0;
ps->capacity = n;
}
// test.cpp
#include"Stack.h"
int main()
{
ST s1;
STInit(&s1);
// 确定知道要插⼊1000个数据,初始化时⼀把开好,避免扩容
ST s2;
STInit(&s2, 1000);
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值