一 const
const必须在初始化赋值,不能在初始化之后赋值。const指针在赋值时必须类型一致。如果是const 指针,那么不能对指针赋值,int *const v=&k;v=&k;//error *v=k//right
同理,如果是指向const int 类型的指针,*v=k//error
二自增:
后置自增返回的是原先的操作数。int k=2;if((k++)==3)
{
cout<<k;
}
结果是不会输出的。但是如果k++;
if((k)==3)
{
cout<<k;
}
结果是输出。所以如果后置++在函数里 直接返回的话 returnk++;k是不会变化的。
三 static
static的成员 在类中,不管是对象还是指针,都没有指向它。
四 构造函数 类成员中含有另一个类对象,这个类有构造函数时,会先调用该;类的构造函数 在调用自己类的构造函数 有继承时,会先调用基类的构造函数,以下为例
class Base{
public:
Base(){cout<<"Base"<<endl;}
};
class A{
public:
A(){cout<<"A"<<endl;}
};
class B{
public:
B(){cout<<"B"<<endl;}
};
class C{
public:
C(){cout<<"C"<<endl;}
};
class D{
public:
D(){cout<<"D"<<endl;}
};
class DE1:public Base{
public:
A a;B b;
DE1(){cout<<"DE1"<<endl;}
};
class DE2:public DE1{
public:
C c;D d;
DE2(){
cout<<"DE2"<<endl;
}
};
输出结果为Base A B DE1 C D DE2;
五 智能指针的实现(不包括自引用问题)
class CountClass{
public:
int CountInt;
int * CountPtr;
CountClass(int * p):CountInt(1),CountPtr(p){}
~ CountClass(){delete CountPtr;}
};
class UserClass{
public:
CountClass * cc;
int user;
UserClass& operator = (const UserClass &uc);
UserClass(int x,int *p):cc(new CountClass(p)),user(x){}
UserClass(const UserClass &uc):cc(uc.cc),user(uc.user){
++cc->CountInt;
}
~ UserClass(){
if((--cc->CountInt)==0)
delete cc;
}
};
UserClass& UserClass::operator = (const UserClass &uc){
++uc.cc->CountInt;
if(--cc->CountInt==0)
delete cc;
cc=uc.cc;
user=uc.user;
return *this;
}
智能指针接受指向动态分配对象的指针,并负责删除他。只有在撤销了指向共享对象的最后一个指针后,才能删除共享对象。
六 时间
include<ctime>
clock_t start;
clock();
七 转义字符
/加上要转义的符号 大小为1
八 二叉树
二叉树的基本操作复杂度为h,h为高度,插入删除的期望高度为lgn
九 string
#include<string>
string可用.size()获取string大小 char n='h';string b;b+=n;char *g="jk";b+=g;可运行通过,也就是说这里的string其实既可以当做char使用,也可以当做char*使用,比如 b=n;b=g.都是可编译运行通过的。b[index]是char型哦!
char * test="test";可以进行的修改是test="fjgljfdk";不可以进行单个的修改,比如test[0]='g';但是如果是 char * test=new test[2];就二者均可进行修改。