C++学习小结-1

上一篇 / 下一篇  2012-08-13 10:57:26 / 个人分类:C++

c,I*k`%w%~,Z0i+r%M0  一、构造和析构函数

(f(h#i*Ad`4O3m0 51Testing软件测试网p!r6G.y8{-s

  C++在幕后为你写的的函数:一个拷贝构造函数,一个赋值运算符,一个析构函数,一对取址运算符。另外,如果你没有声明任何构造函数,它也将为你声明一个缺省构造函数。所有这些函数都是公有的。换句话说,如果你这么写:

HT)UB3MV"C;CP0

9]4Tr!T/[0

"M7]v&A8Z6z0
class Empty{};

4hw)\0B{0  和你这么写是一样的:

)cA|Nm b \%u7s0 51Testing软件测试网P'?!H0Hk P

sLX]&?ax0g0

-LDr5x%o*vkd+qR0class Empty
BZt#_5rK0{
$g9W;L |Ac+K0public:
lo S+Z _6d6j+y0  Empty();                        // 缺省构造函数51Testing软件测试网NRx+{-a"~cn7l
  Empty(const Empty& rhs);        // 拷贝构造函数
51Testing软件测试网/E3VE!? cs6@*L

we,Wt8Fu!HB6o W0p0  ~Empty();                       // 析构函数 ---- 是否为虚函数看下文说明51Testing软件测试网A8d"\uN~}!|
  Empty&
%L!}*~H~^2i&MC+rM5F0  perator=(const Empty& rhs);    // 赋值运算符

f Uk\)X0 51Testing软件测试网0T@"lZ\;g }2L;[

  Empty* operator&();             // 取址运算符
Q_)h?:~ Uhy0  const Empty* operator&() const;51Testing软件测试网M!t\"G+wz
};

y-b0^4jzC8?%hQ o0

|[v*['R+M.U0  深拷贝和浅拷贝:51Testing软件测试网!{xvX t

rr j/glLL0  默认拷贝构造函数均是浅拷贝。但是一个类可能拥有其它资源,如其构造函数分配了一个堆内存,析构函数释放了这个内存,则此时就需要进行深拷贝了,深拷贝不能依赖编译器实现。为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符。51Testing软件测试网 LE$W_J+[

SNo"c6x(@9_0  拷贝构造函数的调用:

A#K/L%[M#Z0

r _s/o:Oz.Z\m0  1、当用类的一个对象去初始化该类的另一个对象时。

r3h0`R"vE*z@5i0

:h0iMJ]f)Y4U7z D0  2、当对象作为函数的实参传递给函数的形参时。51Testing软件测试网&q5Gd'Xin%jo-k

51Testing软件测试网$hzC#js j;m

  3、当函数的返回值是类的对象,函数执行完成返回时。51Testing软件测试网)C#W$kaOz;i!c

y\e)P%qK0  在构造函数中调用另一个构造函数,会生成一个临时对象,并且立即释放。51Testing软件测试网qm+Ou4n _Xv3U)M

_4^(lE WiQ2z%?3T5w0  string c=a;只调用了拷贝构造函数。而string c; c=a;分别调用了构造函数和赋值函数。51Testing软件测试网&[-i5M'ba

5{F}/Y&H0  构造函数和析构函数的注意点:51Testing软件测试网x3wj1j i/NX+q{

3kF/^$a+X/W {2F0  1、构造函数和析构函数不能有返回值51Testing软件测试网*XS2@-C:t^n!Gz

_-{%lN B%Yr1o0  2、可以显式调用构造函数和析构函数

.ll3r*oa7k*usE0

\6fv;t)}n0  3、拷贝(复制)构造函数不能用值传递51Testing软件测试网6BGuk?P3r kg]

51Testing软件测试网 j"k/FY~,vx+kq

  4、不要在构造函数和析构函数中抛出异常和调用有异常抛出的函数,可能会有内存泄露!

5[#T;? b{4k|0

?$b dl~VM[0  5、确定基类有虚析构函数51Testing软件测试网"`v"\/? X

51Testing软件测试网cj0r4L)QN~

  二、static、const、友元与虚函数51Testing软件测试网|t9uG2Z#u C0b

51Testing软件测试网5ZPS-C C v8K1n)I

  1、静态成员使用static申明,在内存中永远只有一份实例(静态变量,类内声明,类外定义)

Q;R(J'G}(m(E7a0 51Testing软件测试网R#b/qW(D,q](RT

  2、是类的对象所共有的51Testing软件测试网;i2F$]nlY

oL6qs}#K*U?+s1I0  3、静态成员变量可以被成员函数访问,但静态成员函数只能访问静态成员变量51Testing软件测试网f3R6l~.F%u7IYb

N,e)S r;VEXyw4O0  4、友元是为了一个普通函数直接访问一个类的保护甚至是私有成员的机制

Qptoq0 51Testing软件测试网5hG^7l{u!`

  虚函数:

cc&vaS(k1_IR4ZI0 51Testing软件测试网'x OPbxC

  在普通成员函数前面加 virtual 关键字

q N*C Bt:WBj_0 51Testing软件测试网t)Q2\oV1gd

  一个函数在基类申明一个virtual,那么在所有的派生类都是是virtual的51Testing软件测试网(G&W;~ Cjnz

51Testing软件测试网o6KE i JP

  一个函数在基类为普通函数,在派生类定义为virtual的函数称为越位

/_(pHx'N3G3y%gf0 51Testing软件测试网Gj5N#fgc5y5L

  抽象类:51Testing软件测试网5wV'@'q ^ B`

51Testing软件测试网}[m2S$lO0|"i

  具有纯虚函数的类就是抽象类51Testing软件测试网~M5E+fF,A

51Testing软件测试网 C/\:F0M;s3eE

  抽象类不能被实例化,所以抽象类只能以指针方式被应用

&}.i/|(k _\7Z0 51Testing软件测试网$?[4S zx@

  抽象类可以防止切片的发生

+f4N |J!UL0

!}MSt0P)G9N0  抽象类不产生虚表。51Testing软件测试网@#S"[&Kc`Zb8mm

-R q hU2`+ldb+W0  const对象与成员:51Testing软件测试网)_0X8Ih&h

8d6G R.q`w d0  1、const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.51Testing软件测试网3CWj A2H8a%]4W

P#W,Q!Eo fBuG}0  2、const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.

]r3lQ_t[0

R9X YkP)\0  3、const成员函数不可以修改对象的数据,不管对象是否具有const性质。51Testing软件测试网 Ai-x"@8g R h8e-j

51Testing软件测试网*{:P ]2v C&bZZ-W

  4、然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,此时的const成员函数是可以修改它的51Testing软件测试网)F$]0JB r`3R*O9m#x)_ p"u

51Testing软件测试网:y f^^1RB"OA

  三、设计与实现

ht kC5i8h v0

$uN fJ6XS0  C++面向对象编程中一条重要的规则是:公有继承意味着 “是一个” 。一定要牢牢记住这条规则。51Testing软件测试网MBs.{6b {u;Du

v/B9i%j%^ o0  C++有两种多态多态形式:

:`1n7A.q8O'bYv-c0

0DM&gEAN0  1、编译时刻多态,编译时刻多态依靠函数重载或者模板实现51Testing软件测试网|X!m;C/Ak)g)]

51Testing软件测试网T"v(H sYI

  2、运行时刻多态。运行时刻多态依靠需函数虚接口实现

C[Zk L_)z2j0

$S-lvD!e_0  引用的使用原则:

F!uo;X8^g kl0 51Testing软件测试网 M8|KS0WX

  1、在可以用引用的情况下,不要用指针

,l|{0lo g1PE0

_nQq:v0  2、引用可以作为“左值”51Testing软件测试网Ept7wN ~;wJ6M

&G!wwKy%Q6h4H-^&Z0  3、引用不允许为空,当存在对象为空时,必须使用指针。 引用指向一个空值,是非常有害的!

6u"W5M~7I0

9x1@.^3~/Cg0  4、尽量用“传引用”而不用“传值”51Testing软件测试网!RL'@1vSw2_

9Ybwfd lR0  5、必须返回一个对象时不要试图返回一个引用51Testing软件测试网&w5Z DSHN&]&?O[

51Testing软件测试网b*A xu rq1_

  6、千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用

rl,VbsX0

TAG:

 

评分:0

我来说两句

Open Toolbar