C++基础之命名空间和引用的使用方法
liebian365 2024-11-21 17:38 25 浏览 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;
}
打印结果:
相关推荐
- “版本末期”了?下周平衡补丁!国服最强5套牌!上分首选
-
明天,酒馆战棋就将迎来大更新,也聊了很多天战棋相关的内容了,趁此机会,给兄弟们穿插一篇构筑模式的卡组推荐!老规矩,我们先来看10职业胜率。目前10职业胜率排名与一周前基本类似,没有太多的变化。平衡补丁...
- VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符"
-
首先,程序中头文件的选择,要选择头文件,在文件中是没有对M_PI的定义的。选择:项目——>”XXX属性"——>配置属性——>C/C++——>预处理器——>预处理器定义,...
- 东营交警实名曝光一批酒驾人员名单 88人受处罚
-
齐鲁网·闪电新闻5月24日讯酒后驾驶是对自己和他人生命安全极不负责的行为,为守护大家的平安出行路,东营交警一直将酒驾作为重点打击对象。5月23日,东营交警公布最新一批饮酒、醉酒名单。对以下驾驶人醉酒...
- Qt界面——搭配QCustomPlot(qt platform)
-
这是我第一个使用QCustomPlot控件的上位机,通过串口精确的5ms发送一次数据,再将读取的数据绘制到图表中。界面方面,尝试卡片式设计,外加QSS简单的配了个色。QCustomPlot官网:Qt...
- 大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写
-
老友相聚,仗剑江湖!《大话西游2》2021全民PK季4月激燃打响,各PK玩法鏖战齐开,零门槛参与热情高涨。PK季期间,不仅各种玩法奖励丰厚,参与PK趣闻录活动,投稿自己在PK季遇到的趣事,还有机会带走...
- 测试谷歌VS Code AI 编程插件 Gemini Code Assist
-
用ClaudeSonnet3.7的天气测试编码,让谷歌VSCodeAI编程插件GeminiCodeAssist自动编程。生成的文件在浏览器中的效果如下:(附源代码)VSCode...
- 顾爷想知道第4.5期 国服便利性到底需优化啥?
-
前段时间DNF国服推出了名为“阿拉德B计划”的系列改版计划,截至目前我们已经看到了两项实装。不过关于便利性上,国服似乎还有很多路要走。自从顾爷回归DNF以来,几乎每天都在跟我抱怨关于DNF里面各种各样...
- 掌握Visual Studio项目配置【基础篇】
-
1.前言VisualStudio是Windows上最常用的C++集成开发环境之一,简称VS。VS功能十分强大,对应的,其配置系统较为复杂。不管是对于初学者还是有一定开发经验的开发者来说,捋清楚VS...
- 还嫌LED驱动设计套路深?那就来看看这篇文章吧
-
随着LED在各个领域的不同应用需求,LED驱动电路也在不断进步和发展。本文从LED的特性入手,推导出适合LED的电源驱动类型,再进一步介绍各类LED驱动设计。设计必读:LED四个关键特性特性一:非线...
- Visual Studio Community 2022(VS2022)安装图文方法
-
直接上步骤:1,首先可以下载安装一个VisualStudio安装器,叫做VisualStudioinstaller。这个安装文件很小,很快就安装完成了。2,打开VisualStudioins...
- Qt添加MSVC构建套件的方法(qt添加c++11)
-
前言有些时候,在Windows下因为某些需求需要使用MSVC编译器对程序进行编译,假设我们安装Qt的时候又只是安装了MingW构建套件,那么此时我们该如何给现有的Qt添加一个MSVC构建套件呢?本文以...
- Qt为什么站稳c++GUI的top1(qt c)
-
为什么现在QT越来越成为c++界面编程的第一选择,从事QT编程多年,在这之前做C++界面都是基于MFC。当时为什么会从MFC转到QT?主要原因是MFC开发界面想做得好看一些十分困难,引用第三方基于MF...
- qt开发IDE应该选择VS还是qt creator
-
如果一个公司选择了qt来开发自己的产品,在面临IDE的选择时会出现vs或者qtcreator,选择qt的IDE需要结合产品需求、部署平台、项目定位、程序猿本身和公司战略,因为大的软件产品需要明确IDE...
- Qt 5.14.2超详细安装教程,不会来打我
-
Qt简介Qt(官方发音[kju:t],音同cute)是一个跨平台的C++开库,主要用来开发图形用户界面(GraphicalUserInterface,GUI)程序。Qt是纯C++开...
- Cygwin配置与使用(四)——VI字体和颜色的配置
-
简介:VI的操作模式,基本上VI可以分为三种状态,分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下:1)...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- “版本末期”了?下周平衡补丁!国服最强5套牌!上分首选
- VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符"
- 东营交警实名曝光一批酒驾人员名单 88人受处罚
- Qt界面——搭配QCustomPlot(qt platform)
- 大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写
- 测试谷歌VS Code AI 编程插件 Gemini Code Assist
- 顾爷想知道第4.5期 国服便利性到底需优化啥?
- 掌握Visual Studio项目配置【基础篇】
- 还嫌LED驱动设计套路深?那就来看看这篇文章吧
- Visual Studio Community 2022(VS2022)安装图文方法
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)