C++基础 ---C++入门(上)

1.C++命名空间

清楚三个用法:1.using namespace std; ------- 将C++库中的所有函数展开。

        2.using std::cout; ------ 如果对cout这个函数常用的话,只展开这个函数,其他内容以及函数并不展开。            

        3.直接指明该内容或者数据来自哪个命名空间    std::cout; std::cin 。

2.缺省参数

缺省函数笑称为“备胎函数”。

全缺省参数:函数的每个参数都给予一个缺省值,比如int add(int a = 10,int b = 20, int c = 30),当我们在调用add函数时,如果调用时没有给add函数传参,就会使用缺省值。

半缺省参数:也就是部分值缺省。int add(int a,int b,int c = 90);

半缺省参数的注意点:需要从右往左以此缺省,不可以间隔。传参时从左往右以此传参。

3.函数重载(一词多义)

函数重载:C++允许同一个作用域可以函数名相同,但是参数必须不同(类型/个数/顺序不同),返回值没有要求。(只是单单返回值不同,不能构成重载)

重点:面试题:1.什么是函数重载?2.C++是如何支持函数重载的?为什么C语言不支持?

1.预处理 ---> 头文件展开,宏替换,条件编译,去掉注释  ---->.i 预处理成.i文件

2.编译 ---> 检查语法,生成汇编代码 ---->.s 编译成.s文件

3.汇编 ---> 汇编代码转成二进制的机器码 --->.o 汇编成.o文件

4.链接 ---> 将两个目标文件链接在一起

函数名修饰规则

gcc的函数修饰后名字不变。而g++的函数修饰后变成【_Z+函数长度+函数名+类型首字母】

C++使用函数名修饰规则后,即使你的函数名是相同的,只要参数的个数、类型、顺序不同都可以构成函数重载,函数重载时使用函数修饰规则,在实现时就会去寻找对应的地址。这也就是C语言使用的是原函数名,一旦使用同一个函数名(同名函数无法区分)就无法进行函数重载的原因。

 四、extern "C"

要求C和C++程序都可以使用C++的(静态库/动态库) ----> 只需要(静态库/动态库)在声明函数前加上extern "C"

五、引用 &

首先区别一下引用和取地址:(数据类型名+&)---> 引用           (&+变量名) ---> 取地址

引用并不是新定义一个变量,而是给已存在的变量取一个别名,并不会开辟新的空间,他和他引用的变量共用同一块内存空间。

引用的注意点:1.引用必须在定义的时候初始化。2.一个变量可以有多个引用。3.一个引用一旦引用一个实体,那就不可以再引用另外的实体。

引用取别名时,变量访问的权限可以缩小,不可以放大。临时变量具有常性

引用涉及权限问题(权限放大和缩小问题只适用于引用与指针间

const 只能给 const,不能给非const

非const 既可以给const,也可以给非const

应用场景:

1.引用做参数

#include <iostream>
using namespace std;
//引用例子,数据交换
void swap(int& a, int& b) {
	int swap = a;
	a = b;
	b = swap;
}
int main() {
	int a1 = 2, b1 = 3;
	swap(a1,b1);
	cout << a1 << "," << b1 << endl;
	return 0;
}

2.引用做返回值

int& add(int a, int b) {
	int c = a + b;
	return c;
}
int main()
{
	int& result = add(1, 2);
	add(3, 4);
	cout << "result = " << result << endl;
	return 0;
}

--------------------------------------------------------------

int& add(int a, int b) {
	static int c = a + b;
	return c;
}
int main()
{
	int& result = add(1, 2);
	add(3, 4);
	cout << "result = " << result << endl;
	return 0;
}

敲敲这两段代码,看看返回值情况,主要印证下面那个观点!!! 

总结:如果需要使用引用做返回值,返回变量必须出了这个函数的作用域后还存在(静态变量、全局变量),这样可以使用引用作为返回值,否则并不安全。引用作为返回值的好处:少创建一个临时对象,提高程序效率的。

 传值和引用的效率比较

#include <time.h>
struct A { int a[10000]; };
void TestFunc1(A a) {}
void TestFunc2(A& a) {}
void main()
{
	A a;
	// 以值作为函数参数
	size_t begin1 = clock();
	for (size_t i = 0; i < 10000; ++i)
		TestFunc1(a);
	size_t end1 = clock();
	// 以引用作为函数参数
	size_t begin2 = clock();
	for (size_t i = 0; i < 10000; ++i)
		TestFunc2(a);
	size_t end2 = clock();
	// 分别计算两个函数运行结束后的时间
	cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;
	cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值