您的位置:首页 > 编程语言 > C语言/C++

C/C++学习笔记(五)面向对象的编程

2013-09-20 08:27 218 查看
面向对象就是object oriented,简称OO,对象就是object,更直观一点就是事物,凡是学过马列的都知道列宁对物质的定义:“物质是标志客观实在的哲学范畴,这种客观实在是人通过感知感觉的,它不依赖于我们的感觉而存在,为我们的感觉所复写、摄影、反映”。我们所说的对象就是这个“物质”,任何对象都应该有它自己的属性和行为特征,我们来描述一个对象的时候都会涉及到它的某些属性和行为特征,比如狗作为一个对象它的属性有毛色、体重、年龄等等,它的行为特征有汪汪叫、摇尾巴等。作为面向对象的编程语言,它最大的一个特点就是能够把现实世界里的对象物质用编程语言描述出来,像C++和java就提供了一种特殊的数据类型类(class)来描述对象,类非常相似于之前介绍过的结构体struct,然而类有结构所没有的很多特性,比如类可以有自己的行为方法(成员方法)、类可以定义成员属性和方法的私有性、类有继承性和多态性等等。

类的定义

类和对象的关系如同数据类型和变量的关系,要想描述某一对象首先要根据对象的公有特性来定义类。类的定义和结构体的定义非常相似,其语法格式:

class 类名{

成员变量(属性);

成员方法;

};

公有和私有

类的成员变量和成员方法是有公有和私有之分的,这也是类的封装性的具体体现。所谓公有就是用public修饰的成员可以在外部访问,所谓私有就是用private修饰的成员外部不可以访问,没有修饰时候默认为私有,另外还有一个protected他们的详细特征如下:

private: 私有控制符。这类成员只能被本类中的成员函数和类的友元函数访问。

protected: 受保护控制符。这类成员可以被本类中的成员函数和类的友元函数访问,也可以被派生类的成员函数和类的友元函数访问。

public: 共有控制符。这类成员可以被本类中的成员函数和类的友元函数访问,也可以被类作用域内的其他函数引用。

如果有时间的话我还会出博文继续详细讲解他们,只是华为的项目大家都懂的苦逼的一比,只能祈祷了。这样我们可以完善一下我们类的定义了:

class 类名{

public:

成员变量(属性);

成员方法;

protected:

成员变量(属性);

成员方法;

private:

成员变量(属性);

成员方法;

};

构造函数和析构函数

类有一个特殊的成员方法称为构造函数,构造函数可以根据需要带有参数,单是不能有返回值,甚至连void都不行,构造函数是与类同名的方法,在构造方法中可以初始化成员数据,也可以用new初始化变量。同时还有一个析构函数,构造函数创建并初始化类的对象,析构函数在对象被撤销后清除并释放所分配的内存,应该用delete释放new分配的内存空间以防内存泄露,析构函数也必须与类同名,其前面有一个‘~’,析构函数没有参数没有返回值。

class 类名{

public:

成员变量(属性);

类名();//默认构造函数

类名(参数列表);//自定义带参数的构造函数

~类名();//析构函数

成员方法;

protected:

成员变量(属性);

成员方法;

private:

成员变量(属性);

成员方法;

};

成员函数的定义

成员函数的在被访问之前必须有一个实现方法,就是成员函数要先定义,成员函数的定义用类名开始,后面的有两个冒号,接下来是函数名及参数列表。语法格式如下:

返回数据类型 类名::函数名(参数列表){

函数体;

}

常量函数

有一些函数不应该修改成员变量的值,则应该用const声明为常量函数。语法格式:

声明

返回数据类型 函数名(参数列表) const;

定义

返回数据类型 类名::函数名(参数列表) const{

函数体;

}

推荐不修改成员变量的函数都写成常量函数。

应用实例

#include "stdafx.h"
#include <iostream>
#include <new>
#include <string>

using namespace std;

class Dog {  
	public:   
		int a;  
		Dog();
		Dog(int i);
		void setAge(int i);
		int getAge() const;
	private:
		int age;
};  
Dog::Dog(){//默认构造函数
}
Dog::Dog(int i){//带参的构造函数
	a=i;
}
void Dog::setAge(int i){//界面函数获取私有变量
	age=i;
}
int Dog::getAge() const{//常量函数
	return age;
}

class Cat {  
public:   
	int b;  
};   

Cat* fun(Dog* dog);
Cat* fun(Dog* dog) {   //类指针作为参数和返回值
	Cat* pTest = new Cat();   
	pTest->b = dog->a;   
	return pTest;  
}    

Dog fun1();
Dog fun1() {   //类作为返回值

	Dog dog(11);    
	return dog;  
} 
int _tmain(int argc, _TCHAR* argv[]) {
	Dog dog= fun1();  
	dog.setAge(5);
	cout<<"dog.getAge="<<dog.getAge()<<endl;
	cout<<"dog.a="<<dog.a<<endl;

	Dog * dog0= new Dog();  //new动态分配内存空间
	dog0->a=10;
	cout<<"dog0->a="<<dog0->a<<endl;
	Cat * cat=fun(dog0);
	cout<<"cat->b="<<cat->b<<endl;

	if(dog0!=NULL){delete dog0;dog0=NULL;}//delete是释放new时候动态分配的内存空间,防止内存泄露
	if(cat!=NULL){delete cat;cat=NULL;}//NULL之前已经说过,防止指向致命空间并改变之的操作

	getchar();
	return 0;  
}
运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: