C++学习小结-2

上一篇 / 下一篇  2012-08-13 11:20:39 / 个人分类:C++

 类中有const数据,必须要有构造函数对它初始化。

;DN^u E0  static const double a;       //静态double常量声明!51Testing软件测试网'I9t ouA]

51Testing软件测试网iZ {zAt

  const double 类名::a=1.04;   //静态初始化!51Testing软件测试网 LU~QF*s7A

R!A&bVp0  T& operator[](int index); //传回数组的一个元素,可读,可写

g u;l K:E{0 51Testing软件测试网;a!uGP;?F

  const T& operator[](int index)const;  //传回数组的一个元素,可读,不可写

o,TS"ws0qd0 51Testing软件测试网 @P*T|'S)zc

  重载函数,区分是不是重载函数的标准:

y"fvv E8u+\5Lu0

nY0q8A$T6H0  (1)只能靠函数的参数来区分重载函数(类型、个数、缺省参数)

B/F6u/[ E*Mq0

2{zpg-whnw0  (2)不能靠函数的返回值来区分重载函数51Testing软件测试网3L,@Z|r~2p U4D

;P;rU5w%S-v+e0  四、C++与C的一些区别

v!Q6l g8A1I"S0 51Testing软件测试网 Z i!Kx?{

  C中struct和C++中struct的区别:

:@J^6|[9PEO0 51Testing软件测试网j:i&a ]2zqj

  C++的struct可以当作class来用,区别是,class中的成员默认是private,而struct的成员默认为public。

/PL?"vV H!{v0 51Testing软件测试网? `-~^]B%E

  C中的struct只能是一些变量的集合体,可以封装数据却不可以隐藏数据,而且成员不可以是函数。51Testing软件测试网 c)oY7X'qE

51Testing软件测试网jEY ~2P

  C中的Struct是用户自定义数据类型(UDT),C++中的Struct是抽象数据类型(ADT),支持成员函数的定义。51Testing软件测试网"T Wvs u w@

51Testing软件测试网&~|5C/Y3X%G3d6o

  C++语言担保,如果p等于NULL,则delete p不作任何事情。

0pO*m!T'@2O_1P0

CTRj4J9x.j(d/p0  delete p 是一个两步的过程:调用析构函数,然后释放内存。51Testing软件测试网A5a4N$H4F3c(TCq

S6p4kB#w%e u*H~0  delete p调用的是operator delete(void*),而delete[] p调用的是operator delete[](void*)。51Testing软件测试网8pVD a\4R@_

51Testing软件测试网 h^9O}'cL e;i-n

  static 关键字至少有下列作用:51Testing软件测试网rTs-Fz

'^&M:Fp YLxBtx0  (1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次, 因此其值在下次调用时仍维持上次的值;51Testing软件测试网(S2[m0^U*C:mL

MO5CGoy)t0  (2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;51Testing软件测试网-l%Rpp)F-f(Y;L

)N"^4w)Y j0  (3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;

e ok,[ i0

.E ~ j f8o.v:L1b0  (4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;

,Fyn'm#tg0

!E ? g'Hn{P0  (5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。51Testing软件测试网IYUv'B9Y*@b

6WUV L4x"f:u\E0  const 关键字至少有下列作用:

@DMv[;nHOWz0 51Testing软件测试网*] `)}v(VI,P Rv!_

  (1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;

s^R'S"Q!q}z%D0Q0

+U)R9PE1[$~eU:a0  (2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为 const,或二者同时指 定为const;51Testing软件测试网jNhR-D)G qF

51Testing软件测试网{!s%Q+g{,{/MV;[

  (3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;

-b G{p)r051Testing软件测试网9I'G8wk`

  (4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;51Testing软件测试网P*Qd k'e!k

51Testing软件测试网v0h/b!K"|%C

  (5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。

QI0Mld0

2Fh4nl~9o)`5Y0  一个基类及其继承类的实现:

j'][[;q\\ J)f0

)GC"w4sX!^0

\nHhW PH5htX0

*P2k_$J3j6U8|0class Base51Testing软件测试网1MQ%K&l'N B:} z:P4B.]
{51Testing软件测试网MZ\ `5yl%x
    public:51Testing软件测试网fo3`%B)F M\F1Hk
    Base(const char *s=NULL);51Testing软件测试网rr6O:t0U2s ]
    Base(const Base& rth);
SF*O C2USj2U0    Base & perator=(const Base & oth);
#eM_i;?Z0    virtual ~Base();51Testing软件测试网WP4iau2WL0J| F
    private:51Testing软件测试网j`-SF+P6{ G2y4P
    char *m_data;51Testing软件测试网 Tpa!@ R&_&P
};
wl3zOH"S0Base::Base(const char* s)
Qsg"{$m9L0{51Testing软件测试网0i'm.I&AT%KN
    if(s==NULL)51Testing软件测试网C\}@0w)qd
    {
w!^8G,b/M`FU0        m_data=new char[1];
1xb4XJ"^ L5v0        m_data[0]='\0';51Testing软件测试网!~[)VGw;G
    }51Testing软件测试网5_9S(A\.o2V-ML
    else
Mr"x/m0SLs ZOi0    {51Testing软件测试网\ j9e j{
        int length=strlen(s);
2`5?:S.c2Oy0        m_data=new char[length+1];51Testing软件测试网U%\9U H^*X g0[:j
        strcpy(m_data,s);51Testing软件测试网d5P*q)|6lS
    }
PKMU}b0}
"P s [ A.A3Ws1^0Base::Base(const Base & oth)
VZ(Q qET$Qb`0{51Testing软件测试网B{I`*I
    int len=strlen(oth.m_data);
"P:q:?J)\6Y~*^0    m_data=new char[len+1];51Testing软件测试网D'us+P3FA u
    strcpy(m_data,oth.m_data);
}4hm"U~pf~D']0}
vM/r%`CC*i0Base & Base::operator=(const Base & oth)
&a&E6_.F;t0{51Testing软件测试网p SV7T5AG _
    if(this==&oth) return *this;
[,~(}n0|0    delete []m_data;51Testing软件测试网l-{0W XDb
    int len=strlen(oth.m_data);
a9fe`u"WQ0    m_data=new char[len+1];
]1grXj VN#|]*o+F0    strcpy(m_data,oth.m_data);
h1ZQ+WnGO0    return *this;51Testing软件测试网4X] @t8F+p8?
}51Testing软件测试网%E#mLP_,m#ydTj4h
Base::~Base()51Testing软件测试网9db ezmY
{51Testing软件测试网3yY Y%wD @lT!W|B
    delete[] m_data;51Testing软件测试网sM-j`3p,\i4@
}
51Testing软件测试网T0o{5K }6@,i

q#w o:Z2f3|O X0class Derived : public Base
Q3JgvT*WKHc0{
n:q&Z j9L#R.vo0    public:
1K*Bg+V2]2i0    Derived(const char* s=NULL,int a=0);
A2aB@!jI;EL@0    Derived(const Derived& oth);51Testing软件测试网 m6J%D4c W&P o:WG#Y*B2M
    Derived& perator=(const Derived& oth);
f+y8c)uf)n0    private:51Testing软件测试网/y"`.Ti`
    int m;51Testing软件测试网 SLWZ}bVM
};
]^X#EH y0Derived::Derived(const char* s,int a):Base(s),m(a){ }51Testing软件测试网(vtg3oR!QW9]/[t:[
Derived::Derived(const Derived& oth):Base(oth),m(oth.m){ }51Testing软件测试网avi1~2z`Y2|
Derived& Derived::operator=(const Derived& oth)
,PX!H)K{+~0{
a!S``&E%ia0    if(this==&oth) return *this;
D{*W*ZU2OX0    Base::operator=(oth);51Testing软件测试网nI;k!g1M
    m=oth.m;
t3^!KD4yWo0    return *this;
]6L1jn!A9DKi0}
51Testing软件测试网j'd w!k#a3?

51Testing软件测试网)]6sL"[ ho

  C++编译器不支持模板头文件和实现代码分离的编译51Testing软件测试网k9m0XN*\K

51Testing软件测试网*qc,F-\)t0d8r,NW

  在分离式编译的环境下,编译器编译某一个.cpp文件时并不知道另一个.cpp文件的存在,也不会去查找(当遇到未决符号时它会寄希望于连接 器)。这种模式在没有模板的情况下运行良好,但遇到模板时就不行,因为模板仅在需要的时候才会具现化出来,所以,当编译器只看到模板的声明时,它不能具现 化该模板,只能创建一个具有外部连接的符号并期待连接器能够将符号的地址决议出来。然而当实现该模板的.cpp文件中没有用到模板的具现体时,编译器懒得 去具现,所以,整个工程的.obj中就找不到一行模板具现体的二进制代码,于是连接器也傻了!

J1rw4i)}0

TAG:

 

评分:0

我来说两句

Open Toolbar