C++基础(二)

文章目录

  • 6.引用
    • 6.3传值,传引用效率比较
    • *6.4引用和指针的区别
  • 7.名字修饰
    • 7.1 extern "C"

6.引用

引用:定义别名。没有再开辟空间
具上节知:
引用使用场景:

  1. 做参数 a. 输出型参数 b. 大对象传参提高效率
  2. 做返回值 a. 修改返回对象 b. 大对象返回提高效率
    注意:如果函数返回时出了对象的作用域,如果返回对象还未还给系统,则可以引用返回。如果已经还给系统,则必须使用传值返回。
#include
using namespace std;
int main()
{
	int a = 10;
	int& b = a;//b是a的别名
	int c = 100;
	int d = 200;
	b = c;//修改b的值,相当于修改a的值
	d = b;
	return 0;
}

C++基础(二)_第1张图片

6.3传值,传引用效率比较

#include
using namespace std;

//测试全局返回
struct A { int a[100000]; };
A a;
//值返回
A TestFunc1() { return a;}
//引用返回
A& TestFunc2() { return a; }
void TestReturnByRefOrValue()
{
	//以值作为函数的返回值类型
	size_t begin1 = clock();
	for (size_t i = 0; i < 100000; ++i)
		TestFunc1();
	size_t end1 = clock();
	//以引用作为函数的返回值类型
	size_t begin2 = clock();
	for (size_t i = 0; i < 100000; ++i)
		TestFunc2();
	size_t end2 = clock();
	//计算两个函数运算完成后的时间
	cout << "TestFunc1 time:" << end1 - begin1 << endl;
	cout << "TestFunc1 time:" << end2 - begin2 << endl;

}
int main()
{
	TestReturnByRefOrValue();
	return 0;
}

C++基础(二)_第2张图片

*6.4引用和指针的区别

int main()
{
	int a = 10;
	int& b = a;
	//打印变量或对象类型
	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;

	const int c = 20;//给c取别名
	//int& d = c;不可以,编译不通过

	return 0;
}

C++基础(二)_第3张图片
权限的放大,平移和缩小

int main()
{
	int a = 10;
	int& b = a;//权限的平移
	const int c = 20;//给c取别名
	//const意味不能修改
	//int& d = c;不可以,编译不通过
	//权限的放大NO.只能权限平移
	const int& d = c;
	//d = 10;错,不能给常量赋值
	//权限的缩小.YES
	int e = 30;
	const int& f = e;
	int i = 1;
	double dd = i;//i可以给dd
		//double& rdd = i;不可以,权限放大
		const double& rdd = i;//rdd引用临时变量,临时变量为double类型。
        //加const权限没有放大
	return 0;
}

C++基础(二)_第4张图片
所有的类型转换都不是对原变量进行处理。不会改变量类型,中间都会产生一个临时变量
int可以变成int的引用,double不可以变成int的引用。加const可以。
类型转换中间会产生临时变量
临时变量具有常性(const)。

char x='c';
int i=x;
//产生临时变量,对临时变量提升,并开始补位。符号位是1补1,是0补0.
const& int x=10;//可以

const有很强的接受度,用了引用尽量用const

void func1(int n)
{

}
void func2(int& n)
{}
//如果n不是做输出型参数,如果用引用传参,函数内如果不改变n,建议尽量用const引用传参
// void func2(const int& n)正确

int main()
{
	int a = 10;
	const int b = 20;
	func1(a);
	func1(b);//普通变量间的赋值不遵循权限的放大和缩小问题,因为是拷贝。
	func1(30);//权限放大和缩小只针对引用和指针
	
	func2(a);
	func2(b);//权限的放大,b只是可读,变成可读可写。传不过去
	func2(30); //权限的放大,同样传不过去
	func2(1.11);//用const可以
	double d=2.22;//用const可以
	return 0;
}

指针和引用的区别:指针和引用基本用途相似

  1. 使用场景
  2. 语法特性及底层原理
  3. 引用替代不了:链式结构,引用必须在定义的时候初始化。
  4. C++引用不能改指向
  5. 指针更强大更危险,引用更局限,更安全,更简单。
struct ListNode
{
 int val;
 struct ListNode* next;//
}
  1. 引用在定义时必须初始化,指针没有要求//语法特性
  2. 引用在初始化时引用一个实体后,就不能引用其他实体,而指针可以在任何时候指向任何一个同类型实体
  3. 没有NULL引用,但NULL指针
  4. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
  5. 引用自加即引用的实体加一,指针自加即指针向后偏移一个类型大小。
  6. 有多级指针,但无多级引用
  7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  8. 引用比指针使用起来相对更安全
    语法层面引用没开空间,指针开4/8字节空间C++基础(二)_第5张图片
    二者一样
    底层实现角度,引用底层是指针实现的

C++基础(二)_第6张图片

7.名字修饰

为什么C++支持重载,C语言不支持?

7.1 extern “C”

将某些工程按照C的风格去编译,在函数前加“extern “C”,告诉编译器,将该函数按照C语言规则编译。
C的程序调用C++的库

你可能感兴趣的:(c++)