注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

清风笑

开始,就是未来

 
 
 

日志

 
 

总结C++  

2011-09-06 22:25:36|  分类: C/C++/MFC |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

    今天借孙鑫的C++教程复习了下C++(许久没用,淡忘了不少呵)。首先,面向对象什么的就不用说了,C++与C相比,主要存在封装性,继承性以及多态性。 

  1.  输入输出流类对象

    它们是cin 、cout和cerr,  cin与>>一起完成输入操作,cout、cerr与<<一起完成输出与标准错误输出。  对于输入来说,我们以如下方式调用即可:
int i;
cin>>i;
注意箭头的方向。在输出中我们还使用endl(end of line),表示换行,注意最后一个是字符‘l’,而不是数字1,endl相当于C语言的'\n',表示输出一个换行。

  2.class与struct的区别

class中对成员没有说明时默认权限是private,而srtuct里面默认权限是public。
  3.  构造函数
   构造函数最重要的作用是创建对象本身 。
   C++规定,每个类必须有一个构造函数,没有构造函数,就不能创建任何对象。

   C++又规定,如果一个类没有提供任何的构造函数,则C++提供一个默认的构造函数(由C++编译器提供),这个默认的构造函数是一个不带参数的构造函数,它只负责创建对象,而不做任何的初始化工作。
   只要一个类定义了一个构造函数,不管这个构造函数是否是带参数的构造函数(常常用来做初始化),C++就不再提供默认的构造函数。也就是说,如果为一个类定义了一个带参数的构造函数,还想要无参数的构造函数,则必须自己定义。

   4.  析构函数 
    当一个对象生命周期结束时,其所占有的内存空间就要被回收,这个工作就由析构函数来完成。
    析构函数是“反向”的构造函数,析构函数不允许有返回值,更重要的是析构函数不允许带参数,并且一个类中只能有一个析构函数。 (默认有一个)
 
    析构函数的作用正好与构造函数相反,对象超出其作用范围,对应的内存空间被系统收回或被程序用delete删除时,析构函数被调用。
   根据析构函数的这种特点,我们可以在构造函数中初始化对象的某些成员变量,给其分配内存空间(堆内存),在析构函数中释放对象运行期间所申请的资源。

   
    5函数的重载
   重载构成的条件:函数的参数类型或参数个数不同,才能构成函数的重载。 例如以下两种情况不能满足重装:

    
    第一种情况:(1)void output();
                        (2)int output(); //
    第二种情况:(1)void output(int a,int b=5); //因为b为可省参数
                         (2)void output(int a); 

 
    6.this指针 。

    this指针是一个隐含的指针,它是指向对象本身,代表了对象的地址

    一个类所有的对象调用的成员函数都是同一代码段。那么成员函数又是怎么识别属于同一对象的数据成员呢?原来,在对象调用pt.output(10,10)时,成员函数除了接受2个实参外,还接受到了一个对象s的地址。这个地址被一个隐含的形参this指针所获取,它等同于执行this=&pt。所有对数据成员的访问都隐含地被加上前缀this->。例如:x=0; 等价于 this->x=0。 

     
    小技巧:在以后的MFC编程中,如果在成员函数中想调用同类中的某个成员,可以使用VC++提供的自动列出成员函数功能,使用this->,VC++将列出该类中的所有成员,我们可以从列表中选择我们想调用的成员。 

     例:

     #include <iostream.h>
class Point
{
public:
 int x;
 int y;
 Point()
 {
  x=0;
  y=0;
 }
 Point(int a,int b)
 {
  x=a;
  y=b;
 }
 ~Point()
 {
 }
 void output()
 {
  cout<<x<<endl<<y<<endl;
 }
 void output(int x,int y)
 {
  x=x;
  y=y;
 }
};

void main()
{
 Point pt(3,3);
 pt.output(5,5);
// pt.init();
 //pt.x=5;
 //pt.y=5;
// cout<<pt.x<<endl<<pt.y<<endl;
 pt.output();
}

此时结果输出的是3,3,而不是5,5,因为output(int x,int y)里面的x,y只是形参,不是成员变量x,y。要想输出为5,5,需要把x=x,y=y;改为this->x=x,this->y=y;

   7.类的继承

    

总结C++ - 勤天 - 勤天

 

   8.函数的覆盖
    函数的覆盖是发生在父类与子类之间的。  
    9.类型转换

    

总结C++ - 勤天 - 勤天

 下列这张图片说明的程序见本页末尾附带的程序

总结C++ - 勤天 - 勤天

 10.多态性
   当C++编译器在编译的时候,发现Animal类的breathe()函数是虚函数,这个时候C++就会采用迟绑定(late binding)的技术,在运行时,依据对象的类型(在程序中,我们传递的Fish类对象的地址)来确认调用的哪一个函数,这种能力就做C++的多态性。(实现动态匹配)。记住,如果基类有函数前加上virtual,如果一个基类指针->某个虚函数,子类有的调用子类的,子类没有的调用父类的。特别:纯虚函数,函数体无内容。

   11. 引用与指针的区别

总结C++ - 勤天 - 勤天

12.虚基类。

用在一个类(记为A)被多个类派生,这些多个类又派生一个类(记C)时,防止重复派生A而在多个类派生A时前可加上Virtual.虚基类是相对的,A是这些多个类中的哪个的虚基类要看C的派生情况。

虚基类构造函数在非虚基类之前.

同一层次中包含多个虚基类,虚基类构造函数按说明的次序调用

13.

总结C++ - 勤天 - 勤天

#ifndef ANIMAL_H_H
#define ANIMAL_H_H
class Animal
{
public:
 Animal(int height,int weight);


 void eat();


 void sleep();
 
 virtual void breathe();//=0;
};

#endif

 

 

#include "Animal.h"
#include <iostream.h>

Animal::Animal(int height,int weight)
{
}

void Animal::eat()
{
 cout<<"animal eat"<<endl;
}

void Animal::sleep()
{
 cout<<"animal sleep"<<endl;
}

void Animal::breathe()
{
 cout<<"aniaml breathe"<<endl;
}

 

 

 

n

    #include "Animal.h"

#ifndef FISH_H_H
#define FISH_H_H
class Fish : public Animal
{
public:
 Fish();

 void breathe();
};
#endif

#include "Fish.h"
#include <iostream.h>
Fish::Fish():Animal(300,400)
{
}

void Fish::breathe()
{
 cout<<"fish bubble"<<endl;
}

#include <iostream.h>

 

#include "Animal.h"
#include "Fish.h"

void fn(Animal *pAn)
{
 pAn->breathe();
}


void main()
{
 //Animal an;
 //an.eat();

// an.breathe();
 Fish fh;
 Animal *pAn;
 pAn=&fh;
 fn(pAn);

}
注:fish继承animal,先调用animal的构造函数,再调用fish的构造函数。析构函数的执行顺序相反。


 

  


 

  

   

  评论这张
 
阅读(51)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017