首页 > 编程语言 >C++(命名空间,输入输出)

C++(命名空间,输入输出)

时间:2023-09-27 19:31:51浏览次数:33  
标签:std 10 int auto 输入输出 cin C++ 引用 命名

从堆上申请空间
#include<malloc.h>
int *p = (int )malloc(10sizeof(int));//malloc返回的是无类型
free(p);//释放内存,不然会造成内存泄漏

命名空间:用户自己定义的作用域

namespace N{
//变量
int a;
//函数
}
int a;//不冲突
  1. 命名空间可以嵌套
  2. 在一个工程中,可以出现多个相同名称的命名空间
  3. 命名空间中成员的使用方式
方式一:命名空间名字::成员名字
namespace N{
//变量
int a =10;
//函数
int ADD(int right,int left){
return right+left;
}
int a=20;//不冲突
int main(){
int a =30;
printf("%d",a);//30
printf("%d",::a);//20 作用域运算符::
printf("%d",N::a);//10//打印作用域为N的变量
N::ADD(10,20);
方式二:using N::a;

(假设:命名空间中某些成员在当前文件中被频繁使用)

namespace N{

//变量

int a =10;

//函数

int ADD(int right,int left){

return right+left;

}


using N::a;
int main(){
printf("%d",N::a);//10
printf("%d",N::a);
printf("%d",N::a);
printf("%d",N::a);
printf("%d",a);//10

N::ADD(10,20);
方法三:using namespace N;

//可以将N命名空间中所有成员当成本文件中的全局变量    缺点:易发生冲突

(当前命名空间中好些成员都要在当前文件中使用)

输入输出

  • cin输入
  • cout输出
  • endl表示换行
命名空间的使用
方式一
#include<iostream>
using namespace std;
int main() {
	int a ;
	double b;
	char c ;
//	cin >> a;
//cin >> b;
//	cin >> c;//cin输入
	cin >> a >> b >> c;
	cout << "hello world" << endl;//cout输出
	cout << a <<" "<< b <<" " <<c << endl;//endl表示换行

	return 0;
}

方式二
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
int main() {
	int a ;
	double b;
	char c ;
//	cin >> a;
//cin >> b;
//	cin >> c;//cin输入
	cin >> a >> b >> c;
	cout << "hello world" << endl;//cout输出
	cout << a <<" "<< b <<" " <<c << endl;//endl表示换行

	return 0;
}


方式三
#include<iostream>
int main() {
	int a ;
	double b;
	char c ;
//	cin >> a;
//cin >> b;
//	cin >> c;//cin输入
std::cin >> a >> b >> c;
	std::cout << "hello world" << std::endl;//cout输出
	std::cout << a <<" "<< b <<" " <<c << std::endl;//endl表示换行

	return 0;
}

函数重载

函数的一种特殊情况,C++允许在同一作用域下,声明函数名相同,但形参不同的情况,如果类型不完全匹配,编译器会有隐式类型转换

#include<iostream>
//#using std::cout;
//#using std::endl;
int ADD(int left, int right) {
	return left + right;
}
double ADD(double left, double right) {
	return left + right;
}
int main() {
	int a =ADD(10, 20);
	double b =ADD(10.2, 3.4);
	
	std::cout<<a<<" "<<b <<std::endl;
	return 0;
}
#include<iostream>
using namespace std;
//作用域不同,无法形成重载
namespace N {
	void func() {
		cout << "func:int+double" << endl;
	}
}
void func() {
	cout << "func()" << endl;
}
//如果两个参数仅仅是因为返回值类型不同,无法构成重载
int func() {
	return 0;
}
//参数不同
void func(int a) {
	cout << "func(int)" << endl;
}
void func(int a,double b) {
	cout << "func(int+double)" << endl;
}
//参数不同
void func(int a,int b) {
	cout << "func(int+int)" << endl;

}
//次序不同
void func(double a, int b) {
	cout << "func(double+int)" << endl;
}

先传参,再分配空间

引用:类型& 别名 = 变量;
  • 引用作为方法的返回值,一定不能返回栈上的空间,比如:局部变量。返回的实体不能随着方法的结束而销毁。
  1. 引用在定义时必须初始化
  2. 一个变量可以有多个引用
  3. 引用一旦引用一个实体,再不能引用其他实体
void Swap(int& left, int& right)
{
 int temp = left;
 left = right;
 right = temp;
}
int& Count()
{
 static int n = 0;
 n++;
 // ...
 return n;
}

指针和引用的区别:概念+性质+使用

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义时必须初始化,指针没有要求。
  3. 引用不能引用其他实体,但是指针可以指向任何一个实体
  4. 没有NULL引用
  5. 引用的大小是引用实体的大小
  6. 引用比指针用起来更安全
  7. 有多级指针,没有多级引用

  • 指针:取地址,解引用的操作需要用户自己完成
  • 引用:取地址,解引用的操作是由编译器完成

在底层,引用按照指针来处理,引用变量是有空间的,空间中存储的是实体的地址。

c/c++程序通过预处理、编译、汇编、链接

内联函数

  • 目的:解决c语言中宏函数不足----->#define出来的内容将其称为宏,在预处理阶段,会被预处理器替换的。
  • 宏常量:#define MAX_SIZE 100
  1. 优点:代码的可读性高,一改全改,程序的可维护性高
  2. 缺点:缺少参数类型检测
  • 在C语言中,const修饰的内容不是常量,而是不能被修改的变量。
  • C++中扩展了const的属性,const修饰的已经是常量,const修饰的常量具有宏替换的作用(发生在编译时)。
#include<iostream>
int main() {
	const int a = 10;//在编译阶段a已经成为10
	int* pa = (int*)&a;
	*pa = 100;
	std::cout << a << std::endl;//std::cout << 10 << std::endl;
	std::cout << *pa << std::endl;
	return 0;
}
  • 宏函数:#define MAX(a,b) a>b?a:b
  1. 优点:在预处理阶段会用宏体替换宏函数,替换之后少了函数调用的参数压栈,开辟栈帧等开销,提高程序的运行效率
  2. 缺点:不会进行类型检查,容易代码膨胀,增加代码长度,无法调试。

c++中宏函数被inline修饰的内联函数替换(时间换空间)——在编译阶段,编译器会用内联函数体来替换函数的调用,可以调试进行参数类型检测,没有副作用

注意:在debug模式下,内联函数默认不会展开

inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

#include<iostream>
inline int ADD(int a,int b) {
	return a + b;
}
int main() {
	int a = 10;
	int b = 20;
	int ret = 0;
	ret = ADD(a,b);
	std::cout << ret <<std:: endl;
	return 0;
}

auto关键字

auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。

int main(){
int a = 10;
auto b =10,e = 11 ,f = 12;
auto c = 12.34;
auto d = 'a';
auto e = TestAtuo();
auto pa = &a; == auto *pa = &a;
auto &ra = a;//引用必须加7
cout<<typeid(b).name()<<endl;
cout<<typeid(c).name()<<endl;
cout<<typeid(d).name()<<endl;
cout<<typeid(e).name()<<endl;
  • 使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。
  • auto不能定义函数的参数和数组

for循环(基于范围的for循环)

  • 注意:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。
#include<iostream>
int main() {
	int array[] = { 1,2,3,4,5 };
	//在循环过程中,e是array数组中每个元素的一份拷贝
	for (auto e : array)
	{
		std::cout << e << std::endl;

	}
//在循环中,e是array数组中每个元素的别名
	for (auto &e : array)
	{
		e *= 2;

	}
	for(auto m :array)
		std::cout << m << std::endl;
	std::cout << std::endl;
	return 0;
}

指针空值nullptr

  • NULL实际是一个宏
int *pa = NULL;
int *pa = nullptr;//推荐

标签:std,10,int,auto,输入输出,cin,C++,引用,命名
From: https://blog.51cto.com/u_16246875/7627991

相关文章

  • .NET Core|--调用C++库|--LibraryImport docker环境下,处理依赖问题--GCC--Docker
    前言万恶之源在于,C#程序中需要调用C++的一个函数库,在Windows环境下,只要保证引用的相关dll存在,就是ok的,但是在Linux环境下,并且我的Webapi程序是部署在docker中的,问题就比较麻烦一些.经历了新建软链接,缺失".so"文件,有了".so"文件后,版本错误:libstdc++.so.......
  • c++正则表达式汇总
    一、校验字符的表达式1汉字:^[\u4e00-\u9fa5]{0,}$2英文和数字:^[A-Za-z0-9]+或[A−Za−z0−9]4,403长度为3-20的所有字符:^.{3,20}$4由26个英文字母组成的字符串:^[A-Za-z]+$5由26个大写英文字母组成的字符串:^[A-Z]+$6由26个小写英文字母组成的字符串:^[a-z]+$7由数字......
  • C++多线程Multithreading std::condition_variable
    多线程Multithreading#include<iostream>#include<thread>#include<mutex>#include<condition_variable>std::mutexmtx;std::condition_variablecv;boolisOdd=true;voidprintOdd(){for(inti=1;i<=100;i+=2){......
  • [JSON|序列化] fastjson自定义字段命名规则 (转发)
    1序言博主本人近期也遇到了基于fatsjson自定义命名字段规则的问题,为加强对此的学习和记忆,故转发这篇博文。博主本人最终采取的方法21.1前置知识fastjson在将对象转变为JSON字符串时,字段默认使用CamelCase规则命名。在1.2.15版本之后,fastjson支持配置Proper......
  • C++启动.bat文件
    在C++中启动一个.bat文件,你可以使用标准库中的system函数。这个函数可以让你在C++程序中执行外部命令。#include<cstdlib>intmain(){//在这里替换成你的.bat文件的路径constchar*batchFilePath="C:\\Path\\To\\Your\\BatchFile.bat";//使用system函......
  • 库函数 | C++17 std::filesystem文件系统 用法指北
    本文将针对常用的场景,对std::filesystem的使用逐一进行验证:判断文件夹是否存在创建单层目录逐级创建多层目录创建多级目录当前文件路径创建文件"from.dat"获取相对于base的绝对路径文件拷贝移动文件或重命名创建文件“example.dat”获取文件大小获取文件最后修改......
  • C++函数返回对象效率以及使用建议
    C++中函数返回值与拷贝白给程序猿 最新推荐文章于 2022-08-2218:48:40 分类专栏: c++ 文章标签: c++ 编程语言五一假期最后一天,看JUC看的头疼,写写blog放松一下。作为自己的第一篇blog,自己就先来谈谈对C++中函数返回return的理解,自己本来在学Java,但是平......
  • C++引用10分钟入门教程
    C++引用10分钟入门教程< C++引用C++引用在本质上是什么,它和指针到底有什么区别? > 我们知道,参数的传递本质上是一次赋值的过程,赋值就是对内存进行拷贝。所谓内存拷贝,是指将一块内存上的数据复制到另一块内存上。对于像char、bool、int、float等基本类型的数据,它们占用的内......
  • C++内存管理
    primitives(基本工具)对比malloc,free不可重载c函数new,delete不可重载C++表达式::operatornew(),::operatordelete()可重载C++函数allocator<T>::allocate(),allocator<T>::deallocate()可自由设计并以之搭配任何容器C++标准......
  • C++ 采用read()和write()读写二进制文件
    以文本形式读写文件和以二进制形式读写文件的区别,并掌握了用重载的>>和<<运算符实现以文本形式读写文件。在此基础上,本节继续讲解如何以二进制形式读写文件。举个例子,现在要做一个学籍管理程序,其中一个重要的工作就是记录学生的学号、姓名、年龄等信息。这意味着,我们需要用一个......