C++(泛型编程)学习笔记【1】

 

阅读源代码心得一二:

1.参照源代码和对应文档及业务知识 掌握各个项目模块的主流程也就是先从每个模块的main函 数开始,按照顺序列出所用的函数,试着画流程图。注意:对于列出的函数我们现在只关心输入什么,处理后输出什么即函数的功能,不用关心函数的实现;

2.从main函数入手,一步一步往下阅读,遇到可以猜测出意思来的简单的函数,可以跳过。但是一定要注意程序中使用的全局变量(如果是C程序),可以把关键的数据结构说明拷贝到一个文本编辑器中以便随时查找。

3.分析函数包(针对C程序),要注意哪些是全局函数,哪些是内部使用的函数,注意extern关键字。对于变量,也需要同样注意。先分析清楚内部函数,再来分析外部函数,因为内部函数肯定是在外部函数中被调用的。
4.需要说明的是数据结构的重要性:对于一个C程序来说,所有的函数都是在操作同一些数据,而由于没有较好的封装性,这些数据可能出现在程序的任何地方,被任何函数修改,所以一定要注意这些数据的定义和意义,也要注意是哪些函数在对它们进行操作,做了哪些改变。

5.边阅读边写注释。

=========================================================================

visual studio外部依赖项:是你工程中显式包含的那些头文件本身所包含的头文件。比如你仅仅在main里包含了一个windows.h,但是windows.h本身就包含相当多的头文件。而这些头文件又包含更多的头文件。于是你的外部依赖性就变得很庞大。若想减少外部依赖项,那就尽量避免包含不必要的头文件。不过根据编译器的行为,可能编译时应该会过滤掉那些虽然包含进来,但完全没有用到的头文件。你完全可以不必理会外部依赖项。

===============================================================================

<memory.h>
提供了内存操作相关的一些函数及声明,如:
extern void *memchr(const void *, int, size_t);
extern void *memccpy();
extern void *memchr();
extern void *memcpy();
extern void *memset();
extern int memcmp();

=====================================================================================================

泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。泛型即是指具有在多种数据类型上皆可操作的含意,与模板有些相似。STL巨大,而且可以扩充,它包含很多计算机基本算法和数据结构,而且将算法与数据结构完全分离,其中算法是泛型的,不与任何特定数据结构或对象类型系在一起。关于泛型的理解可以总结下面的一句话,它是把数据类型作为一种参数传递进来。

===========================================================================================================

C++ 变量作用域:

全局变量

  • 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件。)
  • 生命周期:程序运行期一直存在
  • 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量。
  • 内存分布:全局数据区
  • 注意:如果在两个文件中都定义了相同名字的全局变量,连接出错:变量重定义 
关键字extern用法:
extern在这里起的作用是告诉编译器,你这个变量已经在某个.cpp中已经定义了,这里只不过是声明一下有这个东西,然后拿来用一下。定义只能出现一次,声明却可出现多次,也就是说extern声明可在多个文件中用。

全局静态变量

  •  作用域:文件作用域(只在被定义的文件中可见。)
  • 生命周期:程序运行期一直存在
  • 内存分布:全局数据区
  • 定义方法:static关键字,const 关键字
  • 注意:只要文件不互相包含,在两个不同的文件中是可以定义完全相同的两个静态变量的,它们是两个完全不同的变量
全局变量在声明时默认为extern类型。
全局变量必须在定义的时候初始化,否则编译器会赋予默认的值。
 

静态局部变量

  • 作用域:局部作用域(只在局部作用域中可见)
  • 生命周期:程序运行期一直存在
  • 内存分布:全局数据区
  • 定义方法:局部作用域用中用static定义
  • 注意:只被初始化一次,多线程中需加锁保护
  • 例子: 

局部变量

  • 作用域:局部作用域(只在局部作用域中可见)
  • 生命周期:程序运行出局部作用域即被销毁
  • 内存分布:栈区
  • 注意:auto指示符标示(默认)

 

=============================================================

关键字const:

一、关于一般常量
声明或定义的格式如下:
const <类型说明符> <变量名> = <常量或常量表达式>; [1]
<类型说明符> const <变量名> = <常量或常量表达式>; [2]
[1]和[2]的定义是完全等价的。
例如:
整形int(或其他内置类型:float,double,char)
const int bufSize = 512;
或者
int const bufSize = 512;
因为常量在定义后就不能被修改,所以定义时必须初始化。
bufSize = 128;   // error:attempt to write to const object
const string cntStr = "hello!"; // ok:initialized
 
const i, j = 0; // error: i is uninitialized const
非const变量默认为extern。
const 对象默认为文件的局部变量。要使const变量能够在其他的文件中访问,必须显式地指定它为extern。
例如:
const int bufSize = 512;        // 作用域只限于定义此变量的文件
extern const int bufSize = 512; // extern用于扩大作用域,作用域为整个源程序(只有extern 位于函数外部时,才可以含有初始化式)
二、关于数组及结构体
声明或定义的格式如下:
const <类型说明符> <数组名>[<大小>]…… [1]
<类型说明符> const <数组名>[<大小>]…… [2]
[1]和[2]的定义是完全等价的。
例如:
整形int(或其他内置类型:float,double,char)
const int cntIntArr[] = {1,2,3,4,5};
或者
int const cntIntArr[] = {1,2,3,4,5};
三、关于指针
1.指向const 对象的指针(指针所指向的内容为常量)
声明或定义的格式如下(定义时可以不初始化,因为指针并不是const型):
const <类型说明符> *<变量名> …… [1]
<类型说明符> const *<变量名> …… [2]
[1]和[2]的定义是完全等价的。
例如:
const int i = 100;
const int *cptr = &i;
或者
int const *cptr = &i; [cptr 是指向int 类型的const 对象的指针]
允许把非const 对象的地址赋给指向const 对象的指针,例如:
double dVal = 3.14;          // dVal is a double; its value can be change
const double *cdptr = &dVal; // ok;but can't change dVal through cdptr
不能使用指向const 对象的指针修改基础对象。然而如果该指针指向的是一个没const 对象(如cdptr),可用其他方法修改其所指向的对象。
如何将一个const 对象合法地赋给一个普通指针???
例如:
const double dVal = 3.14;
double *ptr = &dVal; // error
double *ptr =   const_cast<double*>(&dVal);
// ok:   const_cast是C++中标准的强制转换,C语言使用:d ouble *ptr = (double*)&dVal;
2.const 指针(指针本身为常量)
声明或定义的格式如下(定义时必须初始化):
<类型说明符> *const <变量名> = ……
例如:
int errNumb = 0;
int iVal = 10;
int *const curErr = &errNumb; [curErr 是指向int 型对象的const 指针]
指针的指向不能被修改。
curErr = &iVal; // error: curErr is const
指针所指向的基础对象可以修改。
*curErr = 1; // ok:reset value of the object(errNumb) which curErr is bind
 
三、变量初始化:
double a,b = 0.0;  //error      变量a并没有被初始化
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值