Chinaunix首页 | 论坛 | 博客
  • 博客访问: 121095
  • 博文数量: 31
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 361
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-11 15:38
文章分类

全部博文(31)

文章存档

2008年(31)

我的朋友

分类: C/C++

2008-04-01 10:30:32

    今天开始学习C++,由于以前学过C和java,对C++也听说过一些东西,所以今天狂翻了C++教材100页,收获不少,下面对我这次学习的收获选择地作一下总结。
一、C++的特征:封装、继承、多态
二、 1)C++的程序结构:
                 头文件
                 类声明
                 类成员函数实现
                 main函数
    2)类声明:类名:基类名{  数据成员声明;
                 函数成员声明;}
    3)类成员函数实现:返回值 类名::函数名(参数){函数实现}
    4)构造函数:初始化;析构函数:收尾处理
三、拷贝函数     
      拷贝函数用于生成一个函数的副本,当程序员未定义拷贝函数时候,系统会自动生成一个默认的),可见拷贝函数在下面三个情况下被自动使用:
1)用类的一个对象去初始化此类的另一个对象
2)函数的行参是对象
3)函数的返回值是类的对象
四、作用域与可见性
    作用域是一个标识符在程序正文中的有效区域
可见性是当程序运行到某一点,能引用到的标识符,就是该处可见的标识符。
五、静态生存期和动态生存期
    静态生存期:生存期与程序的运行期相同。用static声明,存放于程序的静态存储区(固定地址)处。
动态生存期:诞生于声明,结束于作用域结束处。
六、友元函数
    不同类的对象的成员之间以及成员函数和一般函数间的数据的共享是通过友元函数实现的。
七、同一类的不同对象间数据的共享
    同一类的不同对象间数据的共享主要是通过静态数据成员和静态函数成员实现的。
    1)静态数据成员:每个类中只有一个拷贝,由类的所有对象共同维护和使用,它不属于任何对象,既然这样,访问它就只能通过类:类名::变量名
    2)静态函数成员:为了访问静态数据成员,在类中可以定义静态函数成员,它也不属于任何对象的,所以它可以直接访问静态数据成员和其它函数成员,而对非静态数据成员要通过对象名字。
    这样,静态函数成员和静态数据成员结合实现了同一类的不同对象间数据的共享。
八、对象存储
    对象所占内存空间只用于存放数据成员,函数成员不在每个对象中存储副本,也就是说,函数代码在运行时内存中只有一个拷贝,在编译的时候,编译器将对象和成员函数进行关联(具体的说就是把对象的地址以this指针作为参数传给成员函数),所有的对象执行时都是跳到函数对应的内存上来执行。如果子类继承的函数,应该也是和父类共用同一块内存。对于类中存在虚函数,存储方式与普通成员函数的存储调用的静态关联不同,它是动态关联的:编译器在编译的时候,如果发现类中存在虚函数,那么它就为这个类建立一个虚函数表,实际上就是一个函数指针数组,每个指针指向各个虚函数地址,在这个类的每个对象中存有一个指向虚函数表的指针,执行的时候,通过这个指针调用对应的函数。
九、堆和栈  

    先了解一下一个程序在内存中的存储结构,一个程序在内存中一般分为四个区域:静态区(全局区),常量区,栈,堆。这四个区域存储的内容如下:

1)静态存储区:主要存储全局变量和静态变量(初始化的放在一地方,未初始化的放在另一个地方)。

2)常量区:存储代码和常量

3)栈:函数的局部数据

4)堆:存放动态分配的数据(malloc new

      下面详细说一下堆和栈。堆和栈都是程序运行的时候产生的,但是栈是由系统分配给进程的一段内存,并负责回收;而堆是由程序申请的,系统在空闲内存链表中找到空闲内存块,将它分配给进程,程序负责释放内存。第二、栈是向下增长的;而堆是向上增长的。第三、堆的大小限制比栈的大,比栈灵活,但是效率没有栈高。再有一个就是堆中的头部用一个字节存放堆的大小,而栈的内容全部由程序员决定。

十、既然指针实际上就是一个地址,那么为什么声明的时候要指明它的类型呢?

    指针也是一种变量,因为当声明了一个变量的时候不但在内存为它分派了空间,而且还做了对变量可以哪些运算的限定。
    类的对象声明也一样,除了系统为它分配了内存空间,还无形中限定了它的元算,具体可以进行哪些运算,是类中定义的方法,可以这样说,类的成员函数操作它的对象。

十一、void指针:可以访问任何类型对象的指针

     程序中,可以将任何类型的对象的指针或者地址赋值给void型指针,再通过强制类型转换就可以实现对任何类型对象的访问。例如:
                void * P;
                int * Pi,I;
                P=&I;
                Pi=(int *)p;

十二、数组名

      数组名是数组的首地址,是一个常量,所以可以像指针那样进行“*”运算和加减运算,但不能改变它的值,可以这样理解:数组名是一个常量指针,指针的类型就是一维数组元素的类型,对于二维数组,它的类型就是一个一维数组。

十三、this指针

      它是隐含于每个类成员函数中的一个特殊指针,它用于指向正被成员函数操作的对象。例如构造函数中:x=xx;那么系统执行这条语句的时候,使用的就是this指针,相当于:this.x=xx;


 

阅读(1011) | 评论(0) | 转发(0) |
0

上一篇:C++的多态性

下一篇:linux进程-进程切换

给主人留下些什么吧!~~