天辰代理-天辰代理【主管╇QV:555333】天辰代理【╇QV:555333】《优_质_平_台《《_《《置_顶_待_遇《《一步到位》》函数签名
int f(int a,int b)
↑↑↑↑
返回类型函数名形式参数
其中,函数名+形式参数=函数签名(function signature)。
引用变量
int a=1;
int&b=a;
a++;
cout<<a<<‘‘<<b<<endl;//2 2
天辰代理-天辰代理【主管╇QV:555333】天辰代理【╇QV:555333】《优_质_平_台《《_《《置_顶_待_遇《《一步到位》》注意引用变量的声明方式,&写在等号左边是引用变量的声明,写在右边就是取址符。
变量默认初始化
非Static的Local变量,默认初始化为任意值//Local的Static变量默认初始化为0
Global或Static变量,默认初始化为0(指针为NULL,NULL也是0)
Null Terminator‘\0‘
char s1[]={‘a‘,‘b‘,‘c‘,‘d‘,‘e‘};
char s2[10]={‘a‘,‘b‘,‘c‘,‘d‘,‘e‘};
char s3[]={‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘\0‘};
char s4[10]={‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘\0‘};
char s5[]="abcde";
char s6[6]="abcde";//若char s6[5]="abcde";则编译出错
cout<<s1<<‘‘<<strlen(s1)<<endl;//abcde#‘7
cout<<s2<<‘‘<<strlen(s2)<<endl;//abcde 5
cout<<s3<<‘‘<<strlen(s3)<<endl;//abcde 5
cout<<s4<<‘‘<<strlen(s4)<<endl;//abcde 5
cout<<s5<<‘‘<<strlen(s5)<<endl;//abcde 5
cout<<s6<<‘‘<<strlen(s6)<<endl;//abcde 5
这里面有几个知识点:
比较s1和s3,之所以s1多输出一些奇怪字符,就是因为没有加终止符‘\0‘
比较s1和s2,数组若分配了大小,则C++会自动在字符串末尾添加‘\0‘(其实这一点很容易想到,因为分配了大小的数组,如果元素没有被填满,则剩余元素均会被初始化为0,而0就是‘\0‘)
比较s1和s5,s5_直接写成字符串的形式,C++会自动在字符串末尾添加‘\0‘_
比较s3和s6,s3中发现终止符‘\0‘并不影响strlen的大小;s6中却发现分配大小时需要将终止符考虑上(好奇怪的一点,也就是说,分配大小需要考虑‘\0‘,而strlen会忽略‘\0‘)
比较s1和s2,s3和s4,s5和s6,发现数组初始化的大小并不影响strlen。所以strlen的实现方法应该是,遍历数组直到发现‘\0‘,char s={‘a‘,‘\0‘,‘\a‘}的strlen其实是1
NULL
源码实现应该是#define NULL 0,所以null和Null都是错的,只有NULL才对。
*、++、+的运算级别
*p++你觉得应该是先算p++呢还是*p呢?
*p+1你觉得应该先算p+1呢,还是*p呢
int*i,j
你觉得这样声明的话,j是一个int,还是一个int的指针?
static
static变量的初始化——类外初始化
class A
{
static int x;//不能直接在声明的时候初始化
};
int A::x=0;//类外初始化必须加上int和A::
只有static const变量才能直接在类内声明时初始化
class A
{
static const int x=0;
};
static函数的调用——通过类名调用
class A
{
public:
static void f(){}
};
A a;
a.f();//correct
A::f();//correct
A.f();//wrong
注:这里的子类指的是子类的成员函数,而不是子类对象(子类对象在类外)天辰代理-天辰代理【主管╇QV:555333】天辰代理【╇QV:555333】《优_质_平_台《《_《《置_顶_待_遇《《一步到位》》
public继承、protected继承和private继承