面向对象编程的学习笔记

面向对象编程编程学习:
1.面向对象编程编程是为了解决大程序的开发而产生的,他避免了面向过程开发的诸多缺点,如全局变量控制问题,可读性,维护性问题,成本效率问题等
2.类是一种特殊的数据结构,与结构体类似,用来集成数据和函数,但结构体默认public,而类默认private,类也是一种自定义的数据类型,其变量即为对象
3.面向对象的开发:确定对象及其属性和行为;定义类;创建对象并通过对象将间的协作解决问题
4.类的特征:
a.封装性:函数与目标数据绑定;使用者只能访问对象暴露出来的,可以被外界使用的部分,即对象的接口,未暴露的即为私有属性或函数
b.继承性:基类与派生类
c.多态性:基类与派生类间表现出来的行为不同
5.类的访问控制:私有成员只能出现在所属类的成员函数中,不能被外界函数(包括main())直接使用,保护成员只能被本身或派生类访问
6.类的声明通常与定义分开,声明放在头文件,定义放在.cpp,使用时只需通过“#include “ .h” ”包含进来即可
7.构造函数:不能在类声明时给数据成员赋值
构造函数名与类名同,主要用来为对象分配空间,为数据成员赋值,它不能有返回类型,也不能有return;
构造函数也属于类的成员函数,具有一般成员函数的性质,可以访问类的所有成员,可以是内联函数,可带参数列表,可带默认形参值,还可重载
可在类中声明,类外定义,(类名::构造函数名{}),调用(类名 对象名(实参表) PS:此处实参表匹配构造函数形参表初始化对象)
8.拷贝构造函数:用一个已经存在的对象初始化该类的新对象,定义方法:类名 (类名 &已有对象名){函数体}),eg:Dot::Dot(Dot & d){...} Dot dot1(1.1,2.2);Dot dot2(dot1);
9.析构函数:也是一种特殊的类成员函数,被声明为公有成员用来释放对象的内存空间,或做一些善后工作;函数名与类名同,前加“~“,没有参数,没有返回值,不能重载,因为一个类只能有一个析构函数,撤销对象时(new--->delete),系统自动调用(显式定义,隐式调用),默认为空
10.友元:为了类间的数据共享问题,提供了不同类或对象的成员函数之间,类的成员函数与一般函数之间进行数据共享的机制
友元函数:不属于当前类的成员函数,独立于类存在,可以是普通函数也可是其他类的成员函数,可访问该类的所有成员,包括私有
使用前必须在类定义时声明,前加关键字”friend“,可设为public,或private,定义可在类内部,也可外部,类外定义时不必加”类名::“,因为不是类的成员函数所以不能直接引用对象成员的名字,也不能通过this指针引用,必须通过入口参数传入对象或对象指针使用,eg:friend double area(Rectangle &rectangle){return (rectangle.length*rectangle.width);},当需要访问多个类时,则可把该函数同时定义为这些类的友元函数
友元成员:一个类的成员函数是另一个类的友元函数,此函数即为友元成员,该函数可访问这两个类的所有成员,必须先定义成员函数所在的类,并在声明友元函数时加上成员函数所在类的类名和作用域运算符::,eg:friend void girl::prt(boy &b);另外,如果在类定义前要使用该类的成员,需要在该类使用前对其进行声明;
友元类:在一个类中声明另一个类为友元,eg:class girl{..friend class boy;..},class boy中的函数都成为class girl的友元函数
注意:友元关系不能传递,并且是单向的
11.类定义static成员,用于解决同一个类的不同对象间数据和函数共享问题,一个类的不同对象的静态成员使用同一个内存空间,静态成员包括数据静态和函数静态
有利于类的封装性,可把static定义为private;static成员与类相关联,外部使用时必须用类名做前缀,作用域为类作用域,可避免命名冲突
跟普通数据成员不同,静态数据成员必须在类定义体外定义并初始化(在类中声明,class Student{..static int count;..}),eg: int Student::count
使用:通过”::“从类直接调用,或通过对象,引用该类类型对象的指针间接调用,eg:int g=Student::..,Student *s=&stu1; int n=s->...

静态成员函数可在类的内部或外部定义,外部定义无需加static,不隐含this指针,为内部连接,不会发生同名成员函数的冲突


补充(from  http://www.cnblogs.com/witxjp/archive/2010/04/19/1715681.html

1.new与malloc都是配置内存,但new会引发构造函数的执行。

2.new产生的对象是在堆(heap)内存中产生的,所以直到整个程序结束或者调用delete函数才会释放。而临时对象是在栈(stack)中产生的,当离开作用域时其析构函数就会自动调用,这一点要特别注意。

3.构造函数调用顺序:

  基类->类成员->派生类

 析构函数调用顺序刚好相反

  派生类->类成员->基类

多个全局对象的构造函数的调用顺序跟文件链接时的顺序有关!

4.四中对象的生命期如下:

1)全局对象,程序一开始,构造函数执行(比程序进入点更早),程序即将结束时,析构函数执行。

2)局部对象,对象诞生则构造函数执行,离开作用域,析构函数执行。

3)static对象,诞生则构造函数执行,程序即将结束时,析构函数执行,但比全局对象的析构函数早一步执行。

4)new生成对象,诞生时构造函数执行,delete调用时析构函数执行。

5.四种不同的对象生存方式(stack、heap、global、local static)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值