百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

C++基础之命名空间和引用的使用方法

liebian365 2024-11-21 17:38 19 浏览 0 评论

C++中的cout和endl

在c语言中我们都学习过helloworld程序,那么在c++中如何写一个helloworld呢?

#include<iostream>

//命名空间
using namespace std;

int main(void)
{
    int a;
    //cout 可用于在计算机屏幕上显示信息  
    //endl是回车,换行的意思
    cout << "hello world" << endl;
    cin >> a;
    cout << "a=" << a << endl;
    return 0;
}

#if 0    
#include<stdio.h>

int main()
{
    int a = 0;
    printf("hello world\n");
    scanf("%d". & a);
    return 0;
}
#endif

命名空间(namespace)的使用

所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。

由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:

1)直接指定标识符。例如std::ostream而不是ostream。完整语句如 下:

std::cout	<<	std::hex	<<	3.4	<<	std::endl;

2)使用using关键字。

using	std::cout;	
using	std::endl;	
using	std::cin;

以上程序可以写成 :

cout	<<	std::hex	<<	3.4	<<	endl;

下面详细介绍了三种定义方法:

#include<iostream>

//iostream 提供了一个叫命名空间的东西,标准的命名空间是std
//方式2:
#if 0
using std::cout;
using std::endl; 
using std::cin;
#endif

//方式3:
using namespace std;

int main(void)
{ 
	int a = 0;
#if 0
	//方式1:
	std::cout << "nihao " << std::endl;
	std::cout << "hello " << std::endl;
#endif
	cout << "nihao " << endl;
	cin >> a;
	return 0;
}

输出结果:nihao

除了使用系统提供的std我们也可以自定义命名空间,自定义命名空间方法如下:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

using namespace std;

typedef struct student
{

}student_t;


//定义一个命名空间
namespace spaceA 
{
	int g_a = 10;

}

namespace spaceB
{
	int a = 20;

	namespace spaceC
	{
		struct teacher
		{
			int id;
			char name[64];
		};
	}
	namespace spaceD
	{
		struct teacher
		{
			int id;
			char name[64];
		};
	}
}

int main()
{
	//using spaceA::g_a;
	using namespace spaceA;
	cout << g_a << endl;

	//spaceB::spaceC::teacher t1;
	//using spaceB::spaceC::teacher;
	//teacher t1;

	using namespace spaceB::spaceC;
	spaceB::spaceC::teacher t1;

	t1.id = 10;

	spaceB::spaceD::teacher t2;
	t2.id = 20;

	return 0;
}

输出结果:10

C++语言相比于C语言语法增强的地方

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

using namespace std;

//C++语言对全局变量的检测能力增强
int g_val;//bss段    这个段的数据都为0
//int g_Val = 20;

struct student
{
	char name[64];
	int id;
};


void test01()
{
	//定义一个变量,可以随用随定义
	int i = 0;

	for (int i = 0; i < 10; i++)
	{

	}

	int b = 10;
	cout << "b" << b << endl;
}


void test02()
{
	struct student s1;
	s1.id = 20;
}

int foo()
{
	return 10;
}

int g(int a)
{
	return 10;
}

//bool类型
void test03()
{
	//true 1   false 0  只能取这两个值
 	bool flag = true;
	
	flag = false;

	flag = true;
	cout << "flag(true)" << flag << endl;

	flag = false;
	cout << "flag(true)" << flag << endl;

	flag = -20;
	cout << "flag(true)" << flag << endl;
	cout << sizeof(flag) << endl;//1字节大小

}

void test04()
{
	int a = 10;
	int b = 20;
	int c = 0;
	c = (a < b) ? a : b;
	cout << c << endl;

	//三目运算符可以做左值
	((a < b) ? a : b) = 50;
	cout << "a=" << a << endl;//50
	cout << "b=" << b << endl;//20
}

//c++中const修饰的常量是真正的常量  不可以修改
void test05()
{
	const int a = 10;

	int* p = (int*)&a;

	*p = 20;//这里改变的是临时开辟的temp变量
	cout << "a=" << a << endl;//10
	cout << "*p=" << *p << endl;//20

	int array[a] = { 0 };//ok这里的a是常量 可以编译通过
}

enum season
{
	SPR=0,SUM,AUT,WIN
};

void test06()
{
	enum season s = SPR;
	if (s==AUT)
	{
	}
}
int main()
{
	//test02();
	//g(10, 20, 30);
	//test03();
	//test04();
	//test05();
	test06();
	return 0;
}

引用的基本用法

变量名实质上是一段连续存储空间的别名,是一个标号(门牌号) 通过变量来申请并命名内存空间, 通过变量的名字可以使用存储空间。

引用的概念:

变量名,本身是一段内存的引用,即别名(alias),引用可以看作一个已定义变量的别名。 引用的语法:Type& name = var;

#include	<iostream>
using namespace	std;	
int	main(void)	
{	
				int	a	=	10;	//c编译器分配4个字节内存,	a内存空间的别名
				int	&b	=	a;		//b就是a的别名
				a	=	11;	//直接赋值
				{	
								int	*p	=	&a;	
								*p	=	12;	
								cout	<<	a	<<endl;	
				}	
				b		=	14;	
				cout	<<	"a	=	"	<<a	<<	",	b	=	"	<<	b	<<endl;	
				return 0;	
}

在这里直接赋值a可以修改a的值,通过指针也可以间接修改a的值,最后同样可以通过引用b来修改a的值(b=14)。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>


using namespace std;

/*
1.引用没有定义,是一种关系型声明。声明它和原有某一
变量(实体)的关系。故而类型与原类型保持一致,且不分
配内存。与被引用的变量有相同的地址。
2.声明的时候必须初始化,一经声明,不可变更。
3.可对引用,再次引用。多次
*/

void change_value(int *p)//int p=a;
{
	*p = 30;
}

void change_value2(int& r)//int& r=a;
{
	r = 30;
}

int main()
{
	int a = 10;
	int b = 20;

	int* p = &a;
	*p = 30;

	p = &b;
	*p = 20;

	int& re = a;//re 是 a的引用, int&是引用的数据类型

	re = 50;
	re = b;//  这句话的意思是让a=b   b=20->a=20
	re = 50;
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;//b还是20 

	int& re2 = b;//err,引用一定要初始化
	re2 = a;//这句话是改变re2这名名字  让re2以后叫a  而不是将a的值给re2

	int& re3 = re;
	cout << "a=" << a << endl;
	cout << "re=" << re << endl;
	cout << "re3=" << re3 << endl;


	cout << "------------" << endl;
	cout << "a=" << a << endl;
	change_value(&a);
	cout << "a=" << a << endl;

	a = 100;
	cout << "------------" << endl;
	cout << "a=" << a << endl;
	change_value2(a);
	cout << "a=" << a << endl;

	return 0;
}

引用作为函数参数

普通引用在声明时必须用其它的变量进行初始化,引用作为函数参数声明时不进行初始化。

#include	<iostream>
using namespace	std;	
struct	Teacher	
{	
				char	name[64];	
				int	age	;	
};	
void	printfT(Teacher	*pT)	
{	
				cout<<	pT->age	<<endl;	
}	
//pT是t1的别名	,相当于修改了t1
void	printfT2(Teacher	&pT)	
{	
				pT.age	=	33;	
				cout<<pT.age<<endl;	
}	
//pT和t1的是两个不同的变量
void	printfT3(Teacher	pT)	
{	
				cout<<pT.age<<endl;	
				pT.age	=	45;	//只会修改pT变量	,不会修改t1变量
}	
int	main(void)	
{	
				Teacher	t1;	
				t1.age	=	35;	
				printfT(&t1);	
				printfT2(t1);	//pT是t1的别名
				printf("t1.age:%d \n",	t1.age);	//33
				printfT3(t1)	;//	pT是形参	,t1	copy?份数据 给pT
				printf("t1.age:%d \n",	t1.age);	//33
				return 0;	
}
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

using namespace std;

struct student
{
	int id;
	char name[64];
};

void swap(int* a, int* b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

void my_swap2(int& a, int& b)
{
	int temp = a;
	a = b;
	b = temp;
}

void printS(struct student s)
{
	cout << s.id << " " << s.name << endl;
}

void printS1(struct student* sp)
{
	cout << sp->id << " " << sp->name << endl;
}

void printS2(struct student& s)
{
	cout << s.id << " " << s.name << endl;
}

int main()
{
	int a = 10;
	int b = 20;
	my_swap2(a, b);
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	
	student s1 = { 10,"AC" };
	printS(s1);
	printS1(&s1);
	printS2(s1);

	return 0;
}

引用的本质

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

using namespace std;

struct typeA
{
	int& a;
};
struct typeB
{
	int* a;
};
struct student
{
	int id;
	char name[64];
};
void motify(int*const a)
{
	*a = 100;
}

//当我们将引用作为函数参数时,编译器会替我们将实参
//取地址并传给引用 
void motify2(int&a)
{
	a = 100;//对一个引用操作赋值的时候,编译器替我们隐藏*操作
}
//如果我们再研究引用时,我们可以将引用当做一个常指针去看待
//当使用引用编程时,就将引用理解为一个变量的别名即可。

int main()
{
	cout << "sizeof(struct typeA)" << sizeof(struct typeA) << endl;//4
	cout << "sizeof(struct typeB)" << sizeof(struct typeB) << endl;//4
	//引用所占用的大小与指针相同

	int a = 10;
	int& re = a;//常量需要初始化,引用也需要初始化,引用可能是一种常量

	//引用可能是一种常指针
	int* const p = &a;
	motify(&a);
	motify2(a);
	return 0;
}

引用作为函数参数

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

using namespace std;

char* getmem(int num)
{
	char* p = NULL;
	p = (char*)malloc(num);

	return p;
}
int getmem2(char** pp, int num)
{
	char* p = NULL;
	p = (char*)malloc(num);
	*pp = p;
	return 0;
}
int getA1()
{
	int a = 10;
	return a;
}
int getA2(int*a)
{ 
	*a = 10;
	return 0;
}
//引用作为返回值,不要返回局部变量的引用
int& getA3()
{
	int a = 10;
	return a;
}
int& getA4()
{
	static int a = 10;//该值在全局区存放 不存在风险
	return a;//ok  
}
int main()
{ 
	int a = 0;
	char* pp = NULL;

	a = getA1();
	pp = getmem(10);

	int main_a = 0;
	main_a = getA3();//main_a=temp;
	cout << "main_a" << main_a << endl;//10

	//int& main_a_re = getA3();//接收不到引用的值 
	//cout << "main_a_re" << main_a_re << endl;

	int& main_a_re = getA4();
	cout << "main_a_re" << main_a_re << endl;

	//引用当做函数返回值的话,函数可以做左值
	getA4() = 1000;
	return 0;
}

指针引用

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

 
using namespace std;

struct teacher
{
    int id;
    char name[64];
};

int get_mem(struct teacher** tpp)
{
    struct teacher* tp = NULL;
    tp = (struct teacher*)malloc(sizeof(struct teacher));
    if (tp==NULL)
    {
        return -1;
    }

    tp->id = 100;
    strcpy(tp->name, "tom");
    
    *tpp = tp;

    return 0;
}

void free_teacher(struct teacher**tpp)
{
    if (tpp==NULL)
    {
        return;
    }

    struct teacher* tp = *tpp;
    if (tp!=NULL)
    {
        free(tp);
        *tpp = NULL;
    }
}

int get_mem2(struct teacher*& tp)
{
    tp =(struct teacher*)malloc(sizeof(struct teacher));
    if (tp==NULL)
    {
        return -1;
    }
    tp->id = 100;
    strcpy(tp->name, "mike");
}
void free_mem2(struct teacher*& tp)
{
    if (tp!=NULL)
    {
        free(tp);
        tp = NULL;
    }
}
int main()
{
    struct teacher* tp = NULL;
    get_mem(&tp);
    cout << "id=" << tp->id << ",name=" << tp->name << endl;
    free_teacher(&tp);

    cout << "-------------------" << endl;
    get_mem2(tp);
    cout << "id=" << tp->id << ",name=" << tp->name << endl;

    return 0;
}

打印结果:


const引用

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>


using namespace std;


int main()
{
	//1.如果针对一个常量进行引用,必须是一个const引用
	const int a = 10;

	const int& re = a;

	int b = 10;
	const int& re2 = b;//2.相反如果一个普通变量,用一个const引用接收是可以的

	cout << "b=" << b << endl;
	cout << "re2=" << re2 << endl;
	//ret2 = 300;//err
	b = 30;
	cout << "b=" << b << endl;
	cout << "re2=" << re2 << endl;

	return 0;
}

打印结果:

相关推荐

4万多吨豪华游轮遇险 竟是因为这个原因……

(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...

“菜鸟黑客”必用兵器之“渗透测试篇二”

"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...

科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白

作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...

麦子陪你做作业(二):KEGG通路数据库的正确打开姿势

作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...

知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势

智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...

每日新闻播报(September 14)_每日新闻播报英文

AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...

香港新巴城巴开放实时到站数据 供科技界研发使用

中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...

5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper

本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...

Qt动画效果展示_qt显示图片

今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...

如何从0到1设计实现一门自己的脚本语言

作者:dong...

三年级语文上册 仿写句子 需要的直接下载打印吧

描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...

C++|那些一看就很简洁、优雅、经典的小代码段

目录0等概率随机洗牌:1大小写转换2字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: