c++编程基础个人笔记(二)

1.函数

  • C++的函数返回值类型可以是除数组外的其他任何类型;
  • C++的参数列表中,方括号指出的参数其实并不是数组,而是指针。
int sum_arr(int arr[], int n);

2.函数指针

  • 函数指针的声明
// 一般声明
double pam(int);
double (*pf)(int);
pf = pam;
// 声明指针数组
double (*pf[3])(int) = {pam1, pam2, pam3}; //pam1,pam2,pam3 are three functions with same features
// auto声明指针数组
auto pa = pf;
// typedef进行声明
typedef double (*p_fun)(int);
p_fun pf = pam;
p_fun pf[5];
  • 函数指针的调用,函数指针可以通过*解除引用调用,也可以像函数名一样直接调用;
double pam(int);
double (*pf)(int);
pf = pam;
double x = (*pf)(5);
double x = pf(5); // this is the same to the code above.

3.内联函数

  • inline 内联函数通过直接用函数代码替换函数调用,提高了程序的运行速度;
  • 代码简短、非递归的函数建议使用inline;
  • 内联函数与宏

宏是通过文本替换来实现,不能按值传递,而内联函数可以。

#define SQUARE(x) ((x)*(x)) // SQUARE(c++) = (c++)*(c++), 调用后C将递增两次,而如果定义为内联函数,则c将先计算值,再递增一次

4.引用变量

  • 引用是已定义的变量的别名,使用引用做形参,调用时将直接使用原始数据,不使用副本;
  • 数据量大时,使用引用可以大大节省内存空间。
  • &:左值引用,&&:右值引用。
  • 对于传递的值而不做修改的函数

如果数据对象很小,则按值传递;

如果数据对象数组,则只能使用指针,通常使用指向const的指针;

如果数据对象很大,则使用const指针或const引用;

如果数据对象是类对象,则使用const引用。

  • 对于修改调用函数中数据的函数

如果数据对象是内置数据类型或数组,则使用指针;

如果数据对象是结构,则使用指针或引用;

如果数据对象是类对象,则使用引用。

5.尽量使用const

  • const 可以避免由于无意间修改数据而导致的编程错误;
  • const形参可以处理const和非const实参,非const形参只能处理非const数据;
  • 使用const引用可以避免原始数据被修改。

6.默认参数

  • 对于带参数列表的函数,必须从右向左添加默认值。
  • 对某个默认参数时,需为参数右边的所有参数提供默认值。
int harpo(int n, int m = 4, int j =5); // valid
int chico(int n, int m = 4, int j); // not valid
beeps = harpo(1); // valid
beeps = harpo(1,,6);// not valid
beeps = harpo(1,2,6); //valid

7.函数重载的特征标必须不同--参数列表不同。

8.函数模板

  • 格式,老的格式用class,新的格式用typenam,c++11都兼容两种格式
template <typename T>
  • 具体化优先常规模块,而非模板函数优先具体化和常规模板
//非模板
void Swap(job &, job &);
//常规模板
template <typename T>;
void Swap(T &, T &);
//显式具体化
template <> void Swap<job>(job &, job &);
template <> void Swap(job &, job &);//job可省略
//显示实例化
template void Swap<int>(int, int);  // ---实例化即为直接调用
  • 关键字decltype
//用于执行语句
decltype(x) y; //make the same type as x
//用于返回值
auto h(int x, float y) ->double; //return type is double
template<typename T1, typename T2>
auto gt(T1, T2) -> decltype(x + y) { //return type is the same to (x + y)
    return x + y;
}

9.存储持续性、作用于和链接性

  • 局部变量: 存储于栈中,LIFO(后进先出),函数或代码块创建到释放期间持续,作用域为该函数或代码块内;
  • 静态存储持续性:程序运行过程中均存在;全局变量作用域为所有文件,static定义于文件内,代码块外时,作用域为当前文件,static定义于代码块内时,作用域为当前代码块;
  • 线程存储持续性:通过thread_local声明,该线程持续;
  • 动态持续性:存储于堆中,new-delete期间持续。

10.static说明符

  • 变量持续性:变量将在整个程序运行过程持续,其值能被持续更改;
  • 作用域:限定变量作用域为当前文件或当前代码块。

11.mutable说明符:当结构或类变量为const时,其某个成员也可以被修改。

struct data {
    char name[30];
    mutable int accesses; //accesses can be modified
}
const data veep = {"hello world",0};
veep.accesses = 1; //allowed

12.volatile 限定符:变量直接从内存地址取值,不进行缓存,防止被优化。

13.new作为定位运算符时,可以将变量地址创建到指定地址中。

struct chaff {
    char dross[20];
    int slag;
};
char buffer[100];
int *p1 = new (buffer) chaff; //place structure in buffer
int *p1 = new (buffer) int[20]; //place int array in buffer 

14.名称空间

  • 名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中;
  • using声明由被限定的名称和关键字using组成,using编译指令则通过namespace,被限定的名称和关键字using 组成。using 声明导入名称空间中部分成员变量或函数,而using编译指令则导入名称空间中所有成员;
namespace Jill {  // create namespace Jill
    double pail;
    double fetch;
    int pal;
    struct Well { ...};
}

namespace Jill {  // add goose into namespace Jill
    char * goose(const char *);
}
int para = 1;
using namespace Jill; // using compile code
using Jill::fetch; //using declaration
::para = 2; //global parameter.
  • 原则:使用已命名的名称空间中的变量,而不是使用外部全局变量;
  • 原则:使用已命名的名称空间中的变量,而不是使用静态全局变量;
  • 原则:不要在头文件中使用using编译指令;
  • 原则:导入名称时,首选使用作用域解析运算符或using声明的方法。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值