C++入门 面向对象的基础

C++是一门面向对象的语言,在C语言的基础上有了进一步的扩充与完善。

1、面向对象的特征:

封装:封装是一个用来将对象的状态和行为捆绑到一个单一逻辑单元机制的正式术语。不是面向对象语言所特有,在面向过程的C语言中用结构封装了数据,函数封装了逻辑。但是面向对象封装了数据和逻辑,一定意义上面向对象的封装更加完美。

继承:继承是定义新类的一种机制,使用这种机制创建新类时只需要声明新类和已创建类之间的差别,对于一个特定的继承关系,将新类称为子类或者派生类,被继承的类成为父类或者基类。
多态:指属于两个或多个不同类的对象以各自类相关的不同方式响应同一消息的能力。多态使得消息发送者能给一组具有公共接口的对象发送相同的消息,接收者做出相应的回应。
2、C++的类
类的标准形式:
class <类名>
{
    private:
        私有数据和成员函数
    public:
        公有数据和成员函数
    protected:
        保护数据和成员函数
}
private(私有属性):说明类的成员是私有的,可以被该类的成员函数访问,但类变量不能直接访问;
public (公有属性):说明类的成员是公有的,可以被该类的成员函数和类变量访问;
protected(保护属性):说明该类的成员是被保护的,可以被该类的成员函数和派生类访问,不能被类变量访问。
3、this指针分析
    this指针在类的每个成员函数中都存在,只是没有显示。this指针是通过函数参数的首参数来传递的,在成员函数开始执行前构造好,在成员函数执行结束后释放。
4、构造函数和析构函数    
构造函数:对象被创建时,系统自动调用构造函数,构造函数是类中一种特殊的函数成员,用来在创建对象时初始化对象的数据成员。构造函数的函数名和类名相同,无返回值。
如果类中没有定义构造函数,编译器会提供一个默认构造函数,无返回值,无参数,函数体为空。但如果类中定义了构造函数,编译器就不再提供默认的构造函数。
析构函数:作用和构造函数相反,用于释放资源。当一个对象的生命周期结束前或者被delete(堆对象)时,编译器自动调用其析构函数。
如果类中没有定义析构函数,编译器会提供一个默认析构函数,但默认析构函数不会释放动态分配的资源。
析构函数形式:
~类名(){    }
类应用举例:随机生成一个数组
 

#ifndef _ARRAY_H #define _ARRAY_H class Array { private: int *m_data;
int m_length; void SetLength(int l); void InitArray(); void SetValue(int index, int val); int GetLength(); int GetValue(int index); }; #endif


#include "Array.h" #include <iostream> #include <cstdlib>  using namespace std;  void Array::SetLength(int l) { 	m_length = l; }  void Array::InitArray() { 	if (m_length < 0) 	{ 		m_length = 0; 	}  	m_data = (int *)malloc(sizeof(int) * m_length); 	if (NULL == m_data) 	{ 		cout << "malloc failure!" << endl; 	} }  void Array::SetValue(int index, int val) { 	m_data[index] = val; }  int Array::GetLength() { 	return m_length; }  int Array::GetValue(int index) { 	return m_data[index]; } 
#include "Array.h" #include <iostream>  using namespace std;  int main() { 	int length, i; 	Array a, b;  	cout << "Please input " << endl; 	cin >> length;  	a.SetLength(length); 	a.InitArray();  	for (i = 0; i < a.GetLength(); i++) 	{ 		a.SetValue(i, i + 1); 	}  	for (int j = 0; j < a.GetLength(); j++) 	{ 		cout << a.GetValue(j) << endl; 	}  	return 0; }