孙鑫C++教程笔记02

来源:互联网 发布:杰科网络电视机顶盒 编辑:程序博客网 时间:2024/05/22 12:24
#include <iostream.h>
class Point
{
public:
int x;
int y;
/* void init()
{
x=0;
y=0;
}*/
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)
{
this->x=x;
this->y=y;
}
};
// 定义结构体之后要加 ;
/*
C++中提供了一套输入输出流类的对象,它们是cin 、cout和cerr,对应c语言中的三个文件指针stdin、stdout、stderr,分别指向终端输入、终端输出和标准出错输出(也从终端输出)。cin与>>一起完成输入操作,cout、cerr与<<一起完成输出与标准错误输出。利用cin和cout比C语言中的scanf和printf要方便得多,cin和cout可以自动判别输入输出数据类型而自动调整输入输出格式,不必像scanf和printf那样一个个由用户指定。使用cin,cout不仅方便,而且减少了出错的可能性。对于输出来说,我们像以上方式调用就可以了,对于输入来说,我们以如下方式调用即可:
int i;
cin>>i;
注意箭头的方向。在输出中我们还使用endl(end of line),表示换行,注意最后一个是字符‘l’,而不是数字1,endl相当于C语言的'\n',表示输出一个换行。 
*/
/*
输入输出的头文件
#include<iostream.h>  在C中结构体中是不能有函数的,二C++可以有。
C++结构体和类可以通用  struct 结构体中缺省为 public   class 而类中缺省为 private
public
private
protected
*/

基类的访问特性

类的继承特性

子类的访问特性

Public

Protected

Private

Public

Public

Protected

No access

Public

Protected

Private

Protected

Protected

Protected

No access

Public

Protected

Private

Private

Private

Private

No access

 

void main()
{
Point pt;  //声明一个对象  如一台具体的电脑就是一个对象(实实在在存在的事物),电脑本身是抽象的类
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();
}
///////////////////////////////////////
构造函数


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


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


函数的重载 
 重载构成的条件:函数的参数类型、参数个数不同,才能构成函数的重载。 
 1、只有返回值不同的函数不能构成函数重载    a. void output()  b.int output()  不能构成重载
 2、带有缺省值的函数也不能构成函数重载     a.void output(int a,int b=5);  b. void output(int a);


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


小技巧:在以后的MFC编程中,如果在成员函数中想调用同类中的某个成员,可以使用VC++提供的自动列出成员函数功能,使用this->,VC++将列出该类中的所有成员,我们可以从列表中选择我们想调用的成员。
自动列出成员函数功能,可以提高编写速度,减少拼写错误。我们经常不能完全记住某个函数的完整拼写,但却能够从列表中辨别出该函数,自动列出成员函数的功能在这时就显得更加有用了。事实上,在各种IDE编程环境中,我们通常都不可能记住也没有必要记住所有的函数,只要将常用的函数记住,其他不常用的函数只要记住其大概的写法和功能,在调用该函数时可以从自动列出成员函数中选取,这样可以大大节省我们的学习时间。我们不用花费大量的时间去死记硬背许多函数,利用自动列出成员函数功能和帮助系统,就能够在编程时顺利地使用这些函数,等用的次数多了,也就在不知不觉中完全掌握了这些函数。 


继承:
   在C++中,给我们提供了一种重要的机制,就是继承。 理解继承是理解面向对象程序设计的关键。 
   子类可以继承保护的方法,外部是不能访问被保护的方法
   私有只能在自己内被访问
   Fish::Fish():Animal(300,400),a(1)  //在子类中向基类中传递参数   对常量a进行初始化
{
}
函数的覆盖
函数的覆盖是发生在父类与子类之间的  而函数的重载发生在同一个类当中
::作用域标示符  标示属于哪个类的方法
class Animal
{
public:
Animal(int height,int weight);
void eat();
void sleep();
virtual void breathe();//=0;
virtual void breathe() =0; //纯虚函数
};

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;
}
Fish::Fish():Animal(300,400)
{
}

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

class Fish : public Animal
{
public:
Fish();


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

void main()
{
//Animal an;
//an.eat();
// an.breathe();
Fish fh;
Animal *pAn;
pAn=&fh;
fn(pAn);
}
多态性 
   当C++编译器在编译的时候,发现Animal类的breathe()函数是虚函数,这个时候C++就会采用迟绑定(late binding)的技术,在运行时,依据对象的类型(在程序中,我们传递的Fish类对象的地址)来确认调用的哪一个函数,这种能力就做C++的多态性。
在基类中函数加 virual子类有的调用子类,子类没有的调用父类  根据你传递的对象的地址来决定你所调用的哪一个方法

含有纯虚函数的类为抽象类,由派生类来具体实现。


引用用&定义,指针变量本身需要内存空间。而引用时别名,不需要占用内存空间。没有返回引用的地址的方法。引用通常用在函数传参。


引用:变量的别名
 int a = 6;
 int & b = a;
 b = 5;
 int c = 7;
 b = c;
 
 引用一旦定义并初始化,他就唯一系在特定的目标上面。
 指针存放的是地址值。
 我们通常把类和函数的声明放在头文件中。而把函数的实现放在源文件中。
 包含“”,<>.引号是从当前目录下查找有没有这个头文件。
 尖括号直接从系统目录查找,系统头文件可用<>可以加快搜索的速度。
   
避免头文件重复定义可以加上预编译指令符
#ifndef  POINT_H
#define POINT_H   
class point
{
};
#endif  预编译指令符,防止类的重复定义
注意:在编译过程中头文件是不参与编译的  
0 0