1.指针与数组要注意的点:
●数组:生命数组变量时,一定要写出申请空间,可以使宏常量,但不能是变量,就算变量已经被赋值;
●指针:指针变量声明时的*只是一个指针类型说明符;而在非变量声明语句中,*才是指针运算符;
●指针和变量:数组名a代表数组的首地址;
a=&a[0];
*a=a[0];
a+i=&a[i];
*a+i=a[i];
若整形指针变量p指向整形数组a的首地址,那么可以通过指针变量p访问数组a的元素;此时p+1和p++不同,p+1不改变原来指针变量p的值,而p++则使指针变量p的指向放后移了一位;
2. C++类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:
class CExample {
public:
int a;
float b;
//构造函数初始化列表
CExample(): a(0),b(8.8){}
//构造函数内部赋值
CExample()
{
a=0;
b=8.8;
}
};
-
- ●内置类型的自身对齐模数(有符号无符号相同)
char 1
short 2
int 4
float 4
double 8
- ●内置类型的自身对齐模数(有符号无符号相同)
●指针即为地址,指针几个字节跟语言无关,
而是跟系统的寻址能力有关,
譬如以前是16位地址,指针即为2个字节,
现在一般是32位系统,所以是4个字节,
以后64位,则就为8个字节。
*指针指向的地址长度与主机字长相同32:4;64:8;位除8;
●字节对齐三规则:其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
●C++的类
class Test
{
int a;
char b;
}
Sizeof(Test)=8;
对齐规则:a是int类型占4字节;b是char类型占1字节;相加为5,比5大且为4的倍数值为8;
- 将公共基类指定为虚基类,就可以使该基类的成员在派生类中只有一份拷贝。
3.运用后缀表达式进行计算的具体做法:
建立一个栈S 。从左到右读表达式,如果读到操作数就将它压入栈S中,如果读到n元运算符(即需要参数个数为n的运算符)则取出由栈顶向下的n项按操作符运算,再将运算的结果代替原栈顶的n项,压入栈S中 。如果后缀表达式未读完,则重复上面过程,最后输出栈顶的数值则为结束。
例 : 6 5 2 3 + 8 * + 3 + *
转换成中缀表达式:6*(3+5+(3+2)*8)
4.前缀表达式的计算机求值
从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果
- 例如:- × + 3 4 5 6
- 从右至左扫描,将6、5、4、3压入堆栈
- 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈
- 接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈
- 最后是-运算符,计算出35-6的值,即29,由此得出最终结果
- 注意:遇到 前缀表达式:/ab其运算过程为b入栈,a入栈,/来,栈顶的数a为被除数(被别人除的那个数),所以转换成中缀表达式就是a/b;
5.设计原则
我们一共介绍了 7 种设计原则,它们分别为
开闭原则、里氏替换原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特法则和合成复用原则。
这 7 种设计原则是软件设计模式必须尽量遵循的原则,各种原则要求的侧重点不同。其中,开闭原则是总纲,它告诉我们要对扩展开放,对修改关闭;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;单一职责原则告诉我们实现类要职责单一;接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合度;合成复用原则告诉我们要优先使用组合或者聚合关系复用,少用继承关系复用。
6.ftp默认端口为21
7.补码
正数
正整数的补码是其二进制表示,与