一 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];就二者均可进行修改。