首页 > 编程语言 >c++入门基础(一)

c++入门基础(一)

时间:2024-11-17 18:14:45浏览次数:3  
标签:rand return 入门 int 基础 namespace c++ C++ printf

文章目录


一、C++输入和输出

C++的第⼀个程序

C++兼容C语⾔绝⼤多数的语法,所以C语⾔实现的hello world依旧可以运⾏

// test.cpp
#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}

在这里插入图片描述

C++中需要把定义⽂件代码后缀改为.cpp,vs编译器看到是.cpp后缀就会调⽤C++编译器编译,linux下要⽤g++编译,不再是gcc。
当然C++有⼀套⾃⼰的输⼊输出,严格说C++版本的hello world应该是这样写的。

#include<iostream>
using namespace std;
int main()
{
cout << "hello world\n" << endl;
return 0;
}

vs2022示范:
在这里插入图片描述

二、命名空间

namespace的价值

在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全局作⽤域中,可能会导致很多冲突。
使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
C语言项目类似下⾯程序这样的命名冲突是普遍存在的问题C++引入namespace就是为了更好的解决这样的问题。

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
printf("%d\n", rand);
return 0;
}

vs2022示范:
会报错,由于在stdlib.h中已经有关于rand函数的定义了,所以会显示rand重定义。

在这里插入图片描述
为了避免这样的情况出现,我们可以创建一个域,这样就不会相互冲突了。

namespace的定义

定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可。

namespace space 
{
int rand = 10;
int Add(int left, int right)
{
	return left + right;
}
struct Node
{	
	struct Node* next;
	int val;
};
}

{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
namespace本质是定义出⼀个域 这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。
C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个 变量 /函数 /类型出处 (声明或定义) 的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。
当我们想在别处使用rand函数时,可以这样写:

int main()
{
// 全局的rand函数指针
printf("%p\n", rand);
// 指定count命名空间中的rand
printf("%d\n", bit::rand);
//或者是使用合并后的空间的函数
printf("%d\n",AND::OR);
return 0;
}

namespace只能定义在全局,当然他还可以嵌套定义。项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。

namespace count
{
int rand = 10;
int Add(int left, int right)
{
	return left + right;
}
struct Node
{	
	struct Node* next;
	int val;
};
}

namespace add
{
	int a = 10;
	int b = 20;
	double c = 3.1415;
}

//count 和 add 可以和在一起
namespace add
{
	
	int a = 10;
	int b = 20;
	double c = 3.1415;
	int rand = 10;
	int Add(int left, int right)
	{
		return left + right;
	}
	struct Node
	{
		struct Node* next;
		int val;
	};
}

//嵌套命名空间
namespace AND
{
	namespace OR
	{
		int rand = 1;
		int Add(int left, int right)
		{
			return left + right;
		}
	}
	namespace SIR
	{
		int rand = 2;
		int Add(int left, int right)
		{
			return (left + right)*10;
		}
	}
}
int main()
{
printf("%d\n", AND::OR::rand);
printf("%d\n", AND::SIR::rand);
printf("%d\n", AND::OR::Add(1, 2));
printf("%d\n", AND::SIR::Add(1, 2));
return 0;
}

C++标准库都放在⼀个叫std(standard)的命名空间中,这也就是我们常看到的c++写法中的一幕:

using namespace std;

至于为什么是using namespace ,那就要到了接下来要讲到的命名空间的使用了。

命名空间使用

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。所以下面程序会编译报错。

#include <stdlib.h>
#include<stdio.h>
namespace bit
{
	int a = 0;
	int b = 1;
}
int main()
{
	
	printf("%d\n", a);
	return 0;
}

在这里插入图片描述

所以我们要使用命名空间中定义的变量/函数,有三种方式:
1.指定命名空间访问,项⽬中推荐这种方式。

int main()
{
printf("%d\n", N::a);
return 0;
}

2.using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。

using ADD::OR;
int main()
{
printf("%d\n", ADD::OR);
printf("%d\n", AIR);
return 0;
}

3.展开命名空间中全部成员,练习程序为了方便推荐使用。

using namespce N;
int main()
{
printf("%d\n", a);
printf("%d\n", b);
return 0;
}

三、C++输入&输出

是 Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输⼊、输出对象。
std::cin 是 istream 类的对象,它主要面向窄字(narrowcharacters (of type char))的标准输⼊流。
std::cout 是 ostream 类的对象,它主要面向窄字符的标准输出流。
std::endl 是⼀个函数,流插⼊输出时,相当于插入⼀个换行字符加刷新缓冲区。
<< 是流插⼊运算符, >> 是流提取运算符。

是的,在C语言中这两个运算符是用来作为左移和右移的

使⽤C++输⼊输出更⽅便,不需要像 printf / scanf 输⼊输出时那样,需要⼿动指定格式,C++的输⼊输出可以自动识别变量类型(本质是通过函数重载实现的)其实最重要的是C++的流能更好的⽀持⾃定义类型对象的输⼊输出。

#include<iostream>
int main()
{
	int a = 0;
	char b = 'c';
	double c = 1.23423;
	std::cout << a << " " << b << " " << " "<< c <<std:: endl;

	return 0;
}

注意:在C++中,标准输出流 cout 和换行符操纵符 endl 默认定义在 std 命名空间中。如果代码文件的顶部没有使用 using namespace std; 语句,那么这行代码将无法编译通过,因为编译器不知道 cout 和 endl 的定义。

cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个std(standard)的命名空间中,所以要通过命名空间的使用方式去使用它们。
⼀般日常练习中我们可以using namespace std,实际项⽬开发中不建议using namespace std。

#include<iostream>
using namespace std;

int main()
{
	int a = 0;
	double b, c;
	cin >> a;
	cin >> b >> c;
	cout << a << endl;
	cout << b << " " << c << endl;
	return 0;

}

在这里插入图片描述

四、缺省参数

缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调用该函数时,如果没有指定实参 ,则采用该形参的缺省值,否则使⽤指定的实参。

#include<iostream>
using namespace std;
void Func(int a = 0)
{
   cout << a << endl;
}
int main()
{
   Func(); // 没有传参时,使⽤参数的默认值
   Func(10); // 传参时,使⽤指定的实参
   return 0;
}

在这里插入图片描述

缺省参数分为全缺省和半缺省参数。(有些地方把缺省参数也叫默认参数)全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。

// 全缺省
void Func1(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
// 半缺省
void Func2(int a, int b = 10, int c = 20)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}

C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。

带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。

int main()
{
Func1();
Func1(1);
Func1(1,2);
Func1(1,2,3);
Func2(100);
Func2(100, 200);
Func2(100, 200, 300);
return 0;
}

函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。


标签:rand,return,入门,int,基础,namespace,c++,C++,printf
From: https://blog.csdn.net/q38491/article/details/143817342

相关文章

  • 零基础java学习-预科准备-博客的重要性
    零基础java学习-预科准备-博客的重要性学习准备:博客(英文名blog,正式名称为网络日记)为什么要写博客?(简要:加深印象、总结经验、吸取教训、养成良好习惯收益无穷)1.需要总结和思考,能帮助我们更有效的记忆。2.提升文笔组织能力,进公司可能每周都要写周报,可能会写一些详细的帮助文档,要......
  • 10.C++面向对象7(友元,匿名对象)
    ⭐本篇重点:友元,内部类,匿名对象⭐本篇代码:c++学习/03.c++类与对象-下篇·橘子真甜/c++-learning-of-yzc-码云-开源中国(gitee.com)目录一.友元1.1友元函数 1.2友元类 二.匿名对象 一.友元友元分为友元函数和友元类,它可以帮助我们突破封装的限制。在......
  • C++--多态语法介绍
    目录多态的概念多态的定义及实现多态的构成条件实现多态还有两个必须重要条件虚函数虚函数的重写/覆盖多态场景的⼀个选择题虚函数重写的⼀些其他问题协变析构函数的重写override和final关键字重载/重写/隐藏的对比纯虚函数和抽象类多态的原理虚函数表指针多态的原......
  • C++类型转换详解
        在C语言和C++有很多的类型转换,内置类型(int,char,bool等等编译器自带的)之间的转换像隐式类型转换,强制类型转换,此外还有自定义类型(自己定义的类)和内置类型的转换,自定义类型间的转换,父类和基类之间的类型转换。总之C语言和C++的类型转换复杂多样,如果你对上面的内容有......
  • 书生大模型实训营第4期基础岛第四关:InternLM + LlamaIndex RAG 实践
    书生大模型实训营第4期基础岛第四关:InternLM+LlamaIndexRAG实践1.什么是RAG?2.LlamaIndex+InternLMAPI实践2.1LlamaIndex的简单介绍2.2LlamaIndex+InternLMAPI实践2.2.1开发机环境配置2.2.2下载SentenceTransformer模型2.2.3下载NLTK相关资源2.3是......
  • C++ lambda 表达式与「函数对象」(functor)
    C++lambda表达式与「函数对象」(functor)Created:2024-06-27T16:29+08:00Published:2024-11-17T17:01+08:00Categories:C-CPPfunctor(FunctionObject)首先要介绍的是functor——一个重载了operator()的类,该类的实例可以使用operator()。WhatareC++functorsand......
  • 2024-2025-1(20241321)《计算机基础与程序设计》第八周学习总结
    这个作业属于哪个课程<班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标<深刻学习C语言,反思一周学习,温故知新>作业正文...本博客链接https://www.cnblogs.com/guchu......
  • C++ 模板
    C++模板Created:2024-03-24T20:24+08:00Published:2024-11-17T16:37+08:00Categories:CPP目录偏特化类模板函数模板形参包Question我记不住模板的语法,尤其是偏特化的语法,怎么办?面试问题利用类模板和函数模板实现编译器计算斐波那契数列模板的声明和定义为什么不能分开写......
  • 2024-2025-1 20241314 《计算机基础与程序设计》第八周学习总结
    2024-2025-120241314《计算机基础与程序设计》第八周学习总结作业信息这个作业属于哪个课程<班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里2024-2025-1计算机基础与程序设计第八周作业这个作业的目标功能设计与面向对象设计面向对象设计过......
  • 2024-2025-1 20241415《计算机基础与程序设计》第八周学习总结
    如2024-2025-120241415《计算机基础与程序设计》第八周学习总结作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第八周作业这个作业的目标功能设计与面向对象设计,面向对象设计过程,面向对象语......