【C++】HelloWorld解析 C++入门(1)

目录

1. helloworld实现代码

2. C++关键字

3. 命名空间

3.1 问题引入

3.2 命名空间的定义

3.2.1 :: 域作用限定符

3.2.2 命名空间的使用

3.3 命名空间的使用方法

3.3.1 命名空间+作用域限定符

3.3.2 使用using将命名空间中的成员引用

3.3.3 使用using namespace将命名空间名称引入

4. C++的输入和输出

4.1 缺省参数

4.2 缺省参数的分类

4.2.1 全缺省参数

4.2.2 半缺省参数

5. 函数重载

5.1 函数重载的定义

5.2 函数重载总结


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 函数重载总结

满足下面至少一个条件:

  • 参数类型不同
  • 参数数量不同
  • 参数顺序不同

(本篇完)

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值