07 2012 档案

摘要:1.管理动态分配内存void TestFun(){ int *pval = new int(0); .... //此处省略一万代码... delete pval; pval = NULL; //这一边最好有,不然pval相当于执行一块被释放内存的空间,也就是野指针} 这里涉及到动态分配内存使用后回收问题,虽然上面函数中使用到delete,但不一定能被执行到,在代码"...."中如果有分支(if,while, switch)中有return或者中途抛出异常,函数都会中断,delete不会被执行,这就容易造成内存泄露,如果解决这个问题,可以使用"智能指针". 阅读全文
posted @ 2012-07-30 14:58 bizhu 阅读(225) 评论(0) 推荐(0)
摘要:C++的auto_ptr, auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理。1 构造函数与析构函数auto_ptr在构造时获取对某个对象的所有权(ownership),在析构时释放该对象。我们可以这样使用auto_ptr来提高代码安全性:int* p = new int(0);auto_ptr<int> ap(p);从此我们不必关心应该何时释放p, 也不用担心发生异常会有内存泄漏。这里我们有几点要注意:1) 因为auto_ptr析构的时候肯定会删除他所拥有的那个对象,所有我们就要注意了,一个萝卜一个坑,两个auto_ptr不能同时拥有同一个对象。像这样 阅读全文
posted @ 2012-07-29 21:55 bizhu 阅读(3692) 评论(0) 推荐(0)
摘要:1.在类里涉及到对象拷贝的函数要复制类里每一个成分copy构造函数以及copy assignment操作符如class Test{private: string name;public: Test(const Test& rhs):name(rhs.name) {} Test& operator = (const Test& rhs) { name = rhs.name; return this; }};这样如果类里再添加一个成员变量时,就得需要修改这两个函数,不然新成员不会被拷贝的新对象中,而且编译器一般不会报错2.在继承中,注意base类的拷贝class derve 阅读全文
posted @ 2012-07-29 10:29 bizhu 阅读(345) 评论(0) 推荐(0)
摘要:1.在operator = 中,有可能自己给自己赋值 a[i] = a[j] //潜在自我赋值, 当i = j时 *py = *px //潜在自我赋值 当py和px指向同一个地址时 2.自我赋值的不安全性 class Test{...}; class ManTest { ManTest& operator = (const ManTest& rhs) { delete p; p = new Test(*rhs.p); return *this; } private: Test *p; }; 安全问题:当*this和... 阅读全文
posted @ 2012-07-27 23:49 bizhu 阅读(243) 评论(0) 推荐(0)
摘要:条款九跳过了,里面的内容和我看到的内容有些出入,所以跳过条款十 令operator = 返回一个 reference to *this赋值操作=有时候用于连续的赋值操作,为了类能够连续赋值,并且高效完成可以使用 reference,重载操作符时,令返回值为reference *thisclass Test{ public: Test& operator = (const Test& obj) { ...... return *this; }}可以使用所有的相关的运算操作符 阅读全文
posted @ 2012-07-27 16:47 bizhu 阅读(186) 评论(0) 推荐(0)
摘要:1.最好是不要让析构函数吐出异常,如果析构函数吐出异常而且程序没有结束,这会导致不明确的行为 当异常抛出时,本身函数就结束,函数里的后续处理就不会执行,这要是发生在析构函数里,可能因为 异常而导致后续的数据释放没有完成,造成内存泄露class Test{public: Test(){ p = new char[4]; } ~Test() { throw("exception"); //退出析构函数 delete p; //不会执行 }private: char *p;}; 两种不是很好的解决方法 (1) 结束整个程序:Test *p = new Test; ... 阅读全文
posted @ 2012-07-24 01:02 bizhu 阅读(321) 评论(0) 推荐(0)
摘要:在 c++ 98 里面只有一种智能指针,就是 std::auto_ptr,因为具有唯一所有权的特征,所以限制了它的使用范围,比如你无法在容器中使用它。而我们知道 stl 容器是值语义的,如果不能用智能指针管理的话,只有两种办法来使用。一种是类似这样:std::vector<std::string> names;names.push_back("cyberscorpio");std::string name("news818");names.push_back(name);每次向容器中添加内容的时候,实际上产生了该内容的另一份拷贝,对于简单的内 阅读全文
posted @ 2012-07-23 10:20 bizhu 阅读(3955) 评论(0) 推荐(0)
摘要:一、定义函数指针typedefvoid(*F)(int); voidprint1(intx){ cout<<x; }intmain(){ F a; a = print1; (*a)(20); }二、简单类型替换typedefintI; intmain(){ I a; a = 10; //a = "a";//false cout<<a; }三、定义数组类型typedefintA[3]; intmain(){ A b = {3,4,5}; cout<<sizeof(b); }总结问题:typedef int[8] intarr8;//erro 阅读全文
posted @ 2012-07-22 10:43 bizhu 阅读(333) 评论(0) 推荐(0)
摘要:mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。 下面是一个小例子:class ClxTest{public: void Output() const;};void ClxTest:... 阅读全文
posted @ 2012-07-22 10:38 bizhu 阅读(276) 评论(0) 推荐(0)
摘要:①一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。(可以理解为每次使用该变量时都要从内存中读取,而不是从寄存器中读取)关于优化:在单任务下,在一个函数体内,如果两次读取变量间语句没有对变量的值进行修改,那么编译器就会进行优化。由于寄存器速度快于RAM,所以一般会减少存取外部RAM。②该变量的适用情况:1)并行设备的硬件寄存器(如:状态寄存器)2)一个中断服务子程序中会访问到的非自动变量(Non-automatic variables 阅读全文
posted @ 2012-07-22 10:24 bizhu 阅读(737) 评论(0) 推荐(0)
摘要:1.使用keytool申请获取MD5值 1.1 找到你的debug.keystore Windows Vista/7: C:\Users\<username>\.android\debug.keystore Windows XP: C:\Documents and Settings\<user>\.android\debug.keystore OS X and Linux:~/.android/debug.keystore 1.2 使用cmd切换到debug.keystore所在的目录 我的系统是windows 7 所在文件夹:C:\Users\Work\.androi 阅读全文
posted @ 2012-07-21 12:48 bizhu 阅读(9732) 评论(0) 推荐(2)
摘要:1.如果基类中的成员函数是virtual类型的,其继承类中相应的函数也是virtual类型,并且基类对象的引用指向继承类对象时, 基类就可以调用继承类函数,否则调用的是基类函数class base{public:virtual void fun(){ printf("base fun");}};class derived:public base{public:void fun(){ printf("derived fun");}};derived der;base &b = der; //或者base *b = &der;b.fun(); 阅读全文
posted @ 2012-07-20 21:09 bizhu 阅读(1435) 评论(0) 推荐(0)
摘要:1.可以将要拒绝的编译器会生成的函数自己定义为private的就可以,这样外部就无法调用这些函数,同时, 为了防止内部函数调用,可以只是声明函数,而不定义函数 如,拒绝使用copy构造函数 class Test { private: Test(const Test&); //可以不明确写出参数 }; 这样成员函数或者friend函数调用时,因为没有定义而在链接时报错,这样就可以提前发现. 2.可以定义一个base class,然后将要继承的函数放到private里,要拒绝自动生成的类可以继承该类 阅读全文
posted @ 2012-07-20 16:25 bizhu 阅读(198) 评论(0) 推荐(0)
摘要:1.如果自己没有声明,编译器会自动声明一个default构造函数,一个copy构造函数,一个copy assignment操作符和一个析构函数. 自动声明的这些函数都是public并且inline的,这些函数是在需要时编译器才声明的.class Test{};Test T1; //default构造函数Test T2(T1); //copy构造函数T2 = T1; //copy assignment操作符2.编译器产生的析构函数是no-virtual的,除非继承的父类的析构函数是virtual的3.如果自己声明了上面那四个函数,编译器不会再生成相应的函数.class Test{public:. 阅读全文
posted @ 2012-07-20 16:24 bizhu 阅读(295) 评论(0) 推荐(0)
摘要:三种访问权限public:可以被任意实体访问protected:只允许子类及本类的成员函数访问private:只允许本类的成员函数访问三种继承方式public 继承protect 继承private 继承组合结果基类中 继承方式 子类中public & public继承 => publicpublic & protected继承 => protectedpublic & private继承 = > privateprotected & public继承 => protectedprotected & protected继承 => protectedprotecte 阅读全文
posted @ 2012-07-20 16:09 bizhu 阅读(9409) 评论(1) 推荐(1)
摘要:1、变量的初始化 int a = 0; int b; std::cin >> b; 对于类的成员变量,可使用构造函数 class Test { public: Test(int aVal,int bVal):a(aVal),b(bVal) {} //初始化 private: int a,b; } 注意区分初始化和赋值 Test(int aVal,int bVal){ a = aVal; b = bVal;} //赋值 2.在初始化的初值列表中,初始化的顺序是按照声明的顺序初始化,而不是初值列表的顺序3.若要保证一个... 阅读全文
posted @ 2012-07-18 21:03 bizhu 阅读(198) 评论(0) 推荐(0)
摘要:1.const 修饰指针char greeting[] = "hello";char *p = greeting; //non-const pointer,non-const dataconst char *p = greeting; //non-const pointer,const datachar* const p = greeting; //const pointer,non-const dataconst char* const p = greeting; //const pointer,const data 2.STL迭代器vector<int> v 阅读全文
posted @ 2012-07-18 16:58 bizhu 阅读(271) 评论(0) 推荐(0)
摘要:1.#define定义的变量预处理时没有加入记号表中,若出现错误时很难找到出错之处2.使用#define定义的变量尽量使用const代替,#define A 3可以使用const int A=3代替3.在类里使用static定义const常量,确保至多只有一个const常量4.设计一个类class Test{private:static const int num = 5;int str[num];} 如果编译器不支持num这样声明的时候初始化,则可以使用enum {num = 5}; 如果不支持num那样初始化,则可以在实现文件中,const int Test::num = 5;这样就OK. 阅读全文
posted @ 2012-07-16 23:25 bizhu 阅读(241) 评论(1) 推荐(0)