程序设计基础
1.static变量
存储在全局数据区
静态变量限制在模块内/作用域内
静态变量限制在本文件中,不可被模块外的其他函数调用
静态全局变量:只初始化一次,防止被其他文件单元被引用
静态局部变量:只初始化一次
静态成员变量:无论有多少个类的对象,静态数据成员只有一个实例,由所有对象共享访问,在类外初始化,不与全局变量名字冲突
静态成员函数:无法访问类对象的非静态数据成员,也无法访问非静态成员函数,只能调用其余的静态成员变量/函数,不存在this指针
不可在头文件中定义静态变量,非静态变量也不可行吧
静态变量、对象都是在程序结束时终结
2.const变量
const变量特性:值不可变,类型检查,保护不可变的变量,函数重载,节省空间(const变量在运行过程中只有一份复制品(内存地址唯一),参考指针指向常字符串,指针只有一份复制品),编译器不为const变量分配空间(保存在符号表内)
函数的返回值不可变,const修饰类的成员函数
无法将常引用变量赋值给同类型的非常量变量
3.switch
switch(c) c不能是float类型
4.volatile
类型修饰符(typespecifier),一般用于修饰多线程间被多个任务共享的变量和并行设备硬件寄存器
优化器在用到这个变量时必须每次小心的重新读取这个变量的值(frommemory),而不是实用保存在寄存器里的备份
5.ASSERT()
宏,定义在<assert.h>中,捕获非法情况,如果表达式返回false,程序报告错误,终止运行。只在Debug版本中有效
ASSERT(n!=0);
k=10/n;
assert()类似,可在Release版本应用,在调试结束后,插入#defineNDEBUG来禁用assert
6.枚举变量
枚举变量第一个值默认为0,其他的默认为前一个数+1
7.main()函数
带参:int main(intargc,char* argv[])
argc表示程序从命令行接受的参数个数
argv[] 用来存储参数的字符串数组
在main()执行之前,编译器调用_main()函数进行全局对象构造和初始化
8.运算符
*p++和(*p)++
++a和a++ //寄存器和内存的区别,寄存器所村变量的值可看成变量的临时值,当前可用的值
9.浮点数
10.引用(reference)
1)引用作为函数参数
2)引用作为函数返回值
优点:不会产生被返回值的副本
不能返回局部变量的引用和函数内部new分配的内存的引用,可以返回类成员的常引用
3)常引用
11.C++关键字
extern 普通类型(基本数据类、结构、类)
export 实现模板函数的外部调用
explicit 声明一个构造函数不能作为类型转换操作符被隐式地使用 string s1=“Hello”发生隐式转换,等价于strings1=string("Hello");调用string(const char* p),生成一个临时变量string,再赋给s1.通过explict声明,阻止这个隐式调用过程
12.异常处理机制
finally覆盖try模块的return语句,并在return返回值之前执行
13.指针
野指针:指向不可用内存的指针
任何指针变量在被创建时,不会自动成为NULL指针
一、字符串
1.字符串转换为整数
ASCII码字符与整数做算术运算,就会转换为整数 0-9:48-57 A-Z:65-90 a-z:97-122 int n=c-'0';或int n=c-48;
整数转换为字符串:char c=n+'0';
2.字符串的存储
字符串数组,两个字符串数组的值相同,是两份常量字符串的拷贝,分别存储内存不同地址
字符串指针指向同一个常量字符串,那么它们的值相同,指向这个常量字符串在内存中的地址
C#中,改变string的值会产生新实例,StringBuilder能容纳修改后的值
3.字符串的输入
string s1,s2,s3;
cin>>s1>>s2; //自动忽略开头的空白(空白符,换行符,制表符),遇空格就结束一个字符串的输入
getline(cin,s3); //不忽略空白,遇换行符结束
4.字符类型判断
#include <syslib.h>/* 包含 <ctype.h> */
头文件:#include<ctype.h>
isalpha() //判断是否为大小写字母
isdigit() //判断是否为数字
isalnum() //判断是否为字母或数字,相当于isalpha()|| isdigit() ,为宏定义
二、类,构造函数,虚函数
1.new/delete和malloc/free
new 自动计算需要分配的内存空间返回具体类型的指针类型安全分配+构造+运算符
malloc 需要手动计算返回void *不检查类型安全分配函数、需要stdlib.h支持
2.默认构造函数
具体解析:http://blog.csdn.net/a1937935900/article/details/77044241
只能用初始化列表而不能用赋值进行初始化
赋值是删除原值,赋予新值,初始化列表开辟空间和初始化同时完成
const、reference成员变量,基类的构造函数,成员类型是没有默认构造函数的类
3.自定义复制构造函数、赋值构造函数
string& string(conststring& rhs)
{
if(this==&rhs)
return *this;
delete [] m_data;
m_data=newchar[strlen(rhs.m_data)+1];
strcpy(m_data,rhs.m_data);
return *this;
}
4.虚函数
在派生类中重新定义的的函数应与基类定义的虚函数具有相同的形参个数和形参类型(相同的参数顺序、相同的返回值类型?)
内联函数、全局函数以及类的静态成员函数和构造函数不能定义为虚函数,将析构函数定义为虚函数,析构时调用的是子类的析构函数,解除子类特有的一些变量,不然只是调用基类的析构函数
编译器为类生成虚函数表
虚函数指针指向本类的虚函数表的内存地址
5.C++多态实现
6.初始化问题
C++的初始化列表的赋值顺序,是与C++类里面成员变量的声明顺序相关,与初始化列表里的顺序无关
只能用初始化列表进行初始化的类中成员:const、reference、没有default构造函数的对象,而不能用赋值
下面四种情况必须使用初始化列表来初始化class 的成员:
1.当初始化一个reference member时;
2.当初始化一个const member时;
3.当调用一个base class 的 constructor ,而它拥有一组参数(其实就是自定义的构造函数)时;
4.当调用一个 member class 的 constructor,而它拥有一组参数时。
不过,初始化的顺序是class members声明次序决定的,不是由初始化列表决定的。
三、内存分配
相关解析:http://blog.csdn.net/a1937935900/article/details/76794986操作系统实例Linux探索内存管理部分
内存泄漏
返回new的引用,引用作为一个临时变量出现,没有赋予一个实际的变量,所以无法释放new申请的内存,造成内存泄漏
Windows下,栈为2MB,堆空间一般为2GB
缓存区溢出
向有限缓冲区写入一个超过其长度的字符串会导致:1.程序运行失败、系统奔溃2.利用漏洞执行任意指令,甚至取得root权限,危害系统安全,
sizeof关键字
数据对齐
结构体里每个数据成员的边界对齐和整个结构体的边界对齐
4078

被折叠的 条评论
为什么被折叠?



