IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 2021-08-16 -> 正文阅读

[C++知识库]2021-08-16

C++入门(1)

——std命名空间、cin与cout、缺省参数、引用、函数重载

从今天这篇博客起,我想从我所掌握的角度,逐渐向大家介绍C++的初阶知识。

一、关于std
  std::是个名称空间标识符,C++标准库中的函数或者对象都是在命名空间std中定义的,所以我们要使用标准库中的函数或者对象都要用std来限定。
比如我们要使用标准库中的cout,直接调用是不行的。下面有三种方法来帮助我们调用:
plan1:
指定命名空间(在函数前面加上标准库名),即每使用一次,都在前面加上std::
特点:是最规范的写法,但是麻烦
int main()
{
	std::cout << "hello world" << std::endl;
	std::vector<int> v;
	std::string s;
	return 0;
}

plan2:
把std整个展开(相当于将整个标准库都引进了我们的全局空间)
缺陷:如果我们自己定义的东西跟库里原有的东西冲突了就没办法解决了
一般规范的工程项目中不推荐这种方式

using namespace std;
int main()
{
	cout << "hello world" << endl;
	return 0;
}

plan3:(介于上面两种方式之间)
对部分库中常用的东西展开, 其余在用的时候在前头加上std::
注意只能一行一行写
using std::cout;
using std::endl;

using std::cout;
using std::endl;
int main()
{
	cout << "hello world" << endl;
	std::string s;
	return 0;
}

以上三种方法,对于自己定义的命名空间也可以使用
另外,在C语言中,::变量还有另一种作用:表示全局域

int a = 0;
int main()
{
	int a = 1;
	printf("%d\n", a);//1  局部优先原则
	printf("%d\n", ::a);//0
	return 0;
}

二、C++中的输入(cin)与输出(cout)
这里主要先讲用法,背后的原理暂且不讲,因为涉及到其他知识
cout - 本质上是ostream这个类的全局对象
cin - 本质上是istream类的全局对象

头文件:#include

#include<iostream>
int main()
{
	cout << "hello world";
	//endl是换行符,可加可不加
	//若想换行后再空一行,则:
	cout << "hello world" << endl << endl;
	//好处:可以自动识别类型,printf需要手动输入打印的类型

	int a = 0;
	cin >> a;//cin也可以自动识别类型
	return 0;
}

三、缺省参数
含义:
声明函数时,为函数的参数指定一个默认值,若没有指定实参则采用该默认值
注意点:
(1)必须是从右往左缺省
(2)缺省值必须是常量或者是全局变量

缺省分为全缺省和半缺省:
(1)全缺省

void TestFunc(int a = 10, int b = 20, int c = 30);

(2)半缺省
原则:必须是从右往左缺省(缺省 = 给与默认值,因为实参是从左往右给的),并且是连续的

void Testfunc(int a, int b = 10, int c = 20);//对
void Testfunc(int a = 10, int b = 20, int c);//错

注意:半缺省至少要传一个参数

半缺省在调用时更加灵活

实际应用举例:

struct stack
{
	int* a;
	int size;
	int capacity;
};

void stackInit(struct stack* pa, int Initcapacity = 10)
{
	pa->a = (int*)malloc(sizeof(int) * Initcapacity);
	pa->size = 0;
	pa->capacity = Initcapacity;
}

int main()
{
	//假设事先知道s1里面至少要存放100个数据
	struct stack s1;
	stackInit(&s1, 100);

	//假设事先知道s2里面最少要存放10个数据
	struct stack s2;
	stackInit(&s2);

	return 0;
}
//这样可以根据不同的需要,是初始化时开辟的空间不同,不至于一棍子打死,也不至于浪费空间


四、函数重载
含义:根据参数类型不同个数不同以及顺序不同而命名的同名函数(不包括返回值)
本质上是几个不同的函数****

注意:
但注意:两个同名函数参数类型、参数个数、参数顺序相同,一个有默认参数一个没有,不算重载函数

(1)int Add(int a, int b);
(2)int Add(double a, double b);
(3)int Add(int a = 10, int b = 20);
(4)int Add(int a, int b);
(5)double Add(int a, int b);

(1)(2)是重载
(1)(3)不是重载
(4)(5)不是重载

在实际运用中,缺省参数和函数重载尽量不要一起使用。因为与可能出现二义性错误
例:

void f(int a, int b, int c = 1)

void f(int a, int b)

int main()
{
	f(1, 2, 3);//调用第一个
	f(1, 2);//程序出错! 调用不明确(函数重载没有问题)
	return 0;
}

五、引用
本质是取别名、取外号

定义方式:

int main()
{
	int a = 0;

	//b是a的别名,即b是a的引用
	int& b = a;
	b = 20;//此时a和b的值一起被改变

	//是否可以继续对b取引用?  可以
	int& c = b;
	//此时abc共用同一块空间

	//注意也可以对同一个变量取多个引用
	return 0;

}

具体运用:
在C语言的交换函数中,我们传变量的地址
在C++中还可以传引用

void swap_by_yinyong(int& a, int& b)
{
	int c = 0;
	c = a;
	a = b;
	b = c;
}
int main()
{
	int a = 1;
	int b = 2;
	swap_by_yinyong(a, b);
	cout << a << b << endl;
	return 0;
}

&在变量前面表示取地址,在类型(如int)后面才表示引用
所以通过引用交换时,传的是a和b而不是&a和&b

引用的特点:
(1)引用和变量共用同一块内存空间
(2)引用必须在定义时初始化
(3)已定义的引用不能改变指代的对象

int& r = a;
int x = 10;
r = x;//不是将r变为x的别名,而是将x的值赋给r(a)  r只能是a的引用

(4)一个变量可以有多个引用

·常引用
运用常引用时,记住一个原则:权限可以缩小,但权限不能放大!

const int a = 10;
int& ra = a;//属于权限放大 error!

//但是如果改为:
const int a = 10;
const int& ra = a;//正确   想要成为常变量的引用,必须用const修饰的常引用

//另外,
int b = 10;
const int& rb = b;//属于权限缩小  正确,此时不能再通过rb改变值
                  //但是还是可以通过b修改值,因为b本身不是const

使用常引用时还有一个非常容易出错的点:
还有。虽然在C语言中

int c = 10;
double d = 1.11;
d = c;

是被允许的,有强制类型转换

但是在C++中这么写是错误的:

int c = 10;
double& rc = c;//error!
double& rd = (double)c;//error! 强转转变的不是c的类型,是c的临时变量的类型

从语法上解释,rc此时是c的double类型的临时变量的引用,临时变量具有常量性
因此可以改作:

int c = 10;
const double& rc = c;

总结:C++中用到类型转换时,引用的前面要加上const

·引用的作用
(1)做参数

void swap(int& left, int& right)

(2)做返回值

int& Add(int a, int b)
{
    int c = a + b
        return c;//此时返回的是c的引用
}
int main()
{
    int& ret = Add(1, 2);
    return 0;
}

作返回值时,有两个注意点:
(1)返回值是较大的变量时,尽量传引用 这样可以避免新开辟空间,提高效率
(2)不能返回临时变量的引用

int& Add(int a, int b)
{
    int c = a + b;
    return c;
}
int main()
{
    int& ret = Add(1, 2);
    Add(3, 4);
    cout << "Add(1,2) is:" << ret << endl;//output:7
    return 0;
}

出函数作用域时,如果变量未还给操作系统,则可以返回引用
若已还给操作系统,只能返回值,不能返回引用

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 15:11:24  更:2021-08-17 15:11:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 0:57:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码