- 输入输出
- 函数重载
- 默认参数
- 按C语言的方式编译 extern “C”
- 防止头文件被重复包含
- 内联函数
- 宏
- 命名空间
------------------------------------------------------
输入输出
#include <iostream>
int main()
{
int a;
cin >> a;
cout << a << endl;
getchar();
return 0;
}
函数重载
#include <iostream>
using namespace std;
double sum(int a, int b)
{
return a + b;
}
double sum(double a, double b,int c)
{
return a + b + c;
}
int main()
{
cout << sum(5,5) << endl;
cout << sum(4.5, 6.1,2) << endl;
getchar();
return 0;
}
知识点:1.函数重载可以重载输入变量的顺序、类型、个数,不可重载函数返回类型、函数运算法则(在输入不变的情况下)
2.要区别于函数重写(override),这是子类继承父类后,对函数功能重新实现。重载则是同一个函数名,根据输入不同,定义了多个版本。
默认参数
#include <iostream>
using namespace std;
double sum(int a = 5, int b = 10);
int main()
{
cout << sum(5,5) << endl;
getchar();
return 0;
}
double sum(int a, int b)
{
return a + b;
}
知识点:默认参数只能写在函数声明中,不能写在函数实现中,默认参数可以是常数、全局变量、函数名。
按C语言的方式编译 extern “C”
extern "C" double sum(double a, double b);
说明:extern "C"修饰函数声明即可,实现可以不用修饰。
由于函数声明一般写在头文件中,包含头文件则可以直接调用函数,但是加了extern "C"的代码只能在C++中调用,在C程序调用会出错,为了解决这个问题,还需要在头文件中加一个条件编译。
#ifdef __cplusplus
extern "C"{
#endif
double sum(double a,double b);
#ifdef __cplusplus
}
#endif
知识点:__cplusplus是C++文件才有的宏定义,因此在包括头文件时候会编译 extern "C"部分,而C文件中没有__cplusplus,则只编译sum函数,从而使C++和C都可以调用该函数
防止头文件被重复包含
两种手段:条件编译、#pragma once
区别在于:条件编译可以部分包含(写在if和endif之间),部分不包含(写在if和endif外面),而#pragma once不管写在哪里,该头文件的内容被包含一次后就不会被包含了,且#pragma once对老编译器不兼容
#ifndef __TEST_H__
#define __TEST_H__
/*
代码内容
*/
#endif
#pragma once
/*
代码内容
*/
内敛函数(inline function)
#include <iostream>
inline double sum(double a,double b)
{
return a+b;
}
int main()
{
cout<<sum(0.5,4)<<endl;
/*
cout<<sum(0.5,4)<<endl;将被替换成cout<<0.5+4<<endl;
*/
getchar();
return 0;
}
知识点:内敛函数在调用时候,会将函数体内容直接复制到调用的地方
1.函数调用需要开辟栈空间,调用结束会回收栈空间,内敛函数使用减少函数调用开销
2.代码体积不大(10行以下)/频繁调用函数的时候适合使用内敛函数
3.递归函数即便写成内敛函数,实际上也不会是内敛
宏定义(Macro)
#include <iostream>
#define add(v1,v2) ((v1)+ (v2))
int main()
{
cout<<add(0.5,4)<<endl;
/*
cout<<add(0.5,4)<<endl;将被替换成cout<<0.5+4<<endl;
*/
getchar();
return 0;
}
知识点:宏定义本质是替换,和内敛函数一样能减少函数调用开销,但不推荐用宏,因为宏定义写的不准确,替换结果可能有偏差
命名空间
- 命名空间用于解决命名冲突的问题,访问需要的类时加作用域即可,例如:
HE::Person person;
person.m_age;
namespace HE{
class Person{
int m_age;
}
}
class Person{
int m_height
}
- 在作用域范围内统一使用HE命名空间
using namespace HE;
- 使用全局命名空间的函数
fun()不定义在任何一命名空间里,它是全局的命名空间,访问时用::fun()。
#include <iostream>
void fun(){
...
}
int main(){
::fun();
getchar();
return 0;
}
- 命名空间的合并
如果同一命名空间下定义着不同的变量名,两个命名空间内容会合并