C++语法学习笔记四: 函数新特性、内联函数、const详解

实例代码:


#include <iostream>
using namespace std;

void func123(int, int);//函数声明(函数原型)

void func123(int a, int) { //函数定义
	return;
}

//auto: 变量自动类型推断
auto func234(int a, int b) -> void;//函数声明
auto func234(int a, int b) -> void {//函数定义
	return;
}

inline int myfunc(int testv) {  //函数定义前加inline, 这个普通函数就变成了内联函数。
	return 1;
}

constexpr int mf() {
	//这个函数要写的特别简单
	return 1;
}


int &myfunc1() {
	int tmpvalue = 9;
	cout << &tmpvalue << endl;
	return tmpvalue;  //这种写法是一个很大的隐患

}


struct student { int num; }; //定义一个结构
void fs(student& stu) {
	stu.num = 1010;
}



int main() {

	//一:函数回顾与后置返回类型
	//函数声明(函数原型),可以只有形参类型,没有形参名。
	//函数定义中,形参如果在函数体内用不到的话,可以不给形参变量名字,只给其类型。如下 第二个参数。
	//把函数返回类型放到函数名字之前,这种写法,叫前置返回类型。
	func123(12, 13);

	//C++ 11中,新添加了 后置返回类型,就是再函数声明和定义中,把返回类型写在参数列表之后。
	//		前面放auto,表示函数返回类型放到参数列表之后,而放在参数列表之后的返回类型是通过 -> 开始的。

	func234(11, 22);

	//二: 内联函数
	// 在函数定义前增加了关键字 inline,导致该函数变成内联函数。
	// 引入内联函数的原因: 调用函数需要消耗一定资源,这在经常调用一些很小函数体的函数时不划算,所以定义成内联(inline函数)

	//(1). inline 影响编译器,在编译阶段对inline这种函数进行处理,系统尝试将调用该函数的动作替换为函数本体。通过这种方式,来提升性能
	int a = myfunc(5); // int a = 1;
	//(2). inline只是我们开发者对编译器的一个建议,编译器可以尝试去做,也可以不去做,这取决于编译器的诊断功能。

	//优缺点:
	//代码膨胀的问题: 所以内联函数的函数体尽量要小。

	//注意:各种编译器对inline的处理各不相同,inline函数尽量简单,代码尽可能少。循环、分支、递归调用尽量不要出现在inline函数中。
	//		否则的话,编译器很可能会因为你写这些代码的原因拒绝让这个函数成为一个inline函数。


	//constexpr函数 可以看成是更严格的一种内联函数。


	//三:函数杂合用法总结
	//(1) 函数返回指针和返回引用的情况
	//int *p = myfunc1();
	//*p = 6;// 你往一个不属于你的地址写了数字
	//
	//int &k = myfunc1();
	//cout << &k << endl;
	//k = 10;// 你往一个不属于你的地址写了数字
	//
	//int k = myfunc1();  //这种写法是可以的
	//cout << &k << endl;
	//k = 10; //安全
	//(2)没有形参可以保持形参列表为空(),或者int myfunc1(void)
	//(3)如果一个函数我们如果不调用的话,则该函数可以只有声明部分,没有定义部分
	//(4)普通函数,定义只能定义一次,声明可以声明多次。
	//(5)void func1(int &ta, int &tb);  在C++中更习惯用引用类型的形参来取代指针类型形参
	student abc;
	abc.num = 100;
	fs(abc);
	cout << abc.num << endl; //输出: 1010
	//(6)C++中,函数允许同名,但是形参列表的参数类型或者数量应该有明显的区别。

	//四: const char* 、char const* 、char* const 三者的区别
	const int ab = 12; //定义一个常量abc 
	//abc = 13; // 不可以 
	//(1) cosnt char *p;   //p 指向的东西不能通过p来修改(p所指向的目标,那个目标中的内容不能通过p来改变)
	//(2) char const *p;   //和上面cosnt char *p等价
	//(3) char* const p;   //p指针不可修改,一旦指向了一个东西之后,就不可以再指向其他东西了
	char str[] = "I Love China!";
	char* const p = str; //定义的时候必须初始化
	//(4) const char * const p = str;  // p指针不可修改,p指针指向的内容也不能通过p来修改


	system("pause");
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值