C++面向对象编程

Posted herdyouth

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++面向对象编程相关的知识,希望对你有一定的参考价值。

面向对象先来看看class怎么写。侯捷老师分享的如下两种class分类我觉得很到位:
•Class without pointer member(s)
•Class with pointer member(s)

按这两种分法写两个类练练手就可以粗略了解到C++的面向对象轮廓了。(当然这种感觉是需要有面向对象编程基础的人才能体会的,如果一直是做面向过程编程的估计不太有感吧)

**

Class without pointer member(s)

**
这种Class在上一篇《C++编程习惯(C++预备篇)》
中的MyComplex已经介绍了很多注意点。只有友元函数还没有举例说明。

**

Class with pointer member(s)

**
与Class without pointer member(s)最大的区别在于,这种Class是一定要自己写 拷贝构造函数和拷贝赋值函数的(深拷贝),不能使用编译器默认的拷贝构造和拷贝赋值。当然如果涉及到new内存,可能还需要自己写析构函数。

// MyString.h
#ifndef __MYSTRING__
#define __MYSTRING__

#include <iostream>

class MyString
{
public:
    // 拷贝构造
	MyString(const char* cstr = 0);
	MyString(const MyString& str);
	// 拷贝赋值
	MyString& operator = (const MyString& str);
	// 析构函数
	~MyString();


private:
	char* m_data;
};

#endif
// MyString.cpp
#include <iostream>
#include "MyString.h"

using namespace std;

// 拷贝构造
inline MyString::MyString(const char* cstr = 0)
{
	cout << "拷贝构造MyString(const char* cstr = 0)" << endl;
	if (cstr)
	{
		m_data = new char[strlen(cstr)+1];
		strcpy(m_data, cstr);
	} 
	else
	{ // 未指定初值
		m_data = new char[1];
		*m_data = '\\0';
	}
}
inline MyString::MyString(const MyString& str)
{
	cout << "拷贝构造MyString(const MyString& str)" << endl;
	// 在C++里对象没有空不空,
	// 只有指针有空不空的概念(例如上一个构造函数),指针用NULL来判断
	m_data = new char[strlen(str.m_data) + 1];
	strcpy(m_data, str.m_data);
}

// 拷贝赋值
inline MyString& MyString::operator = (const MyString& str)
{
	cout << "拷贝赋值MyString(const MyString& str)" << endl;
	// 检查自我赋值:(1) 提升效率 (2) 避免产生不确定的行为出错
	if (this == &str)
	{
		return *this;
	}

	delete[] m_data;
	m_data = new char[strlen(str.m_data)+1];
	strcpy(m_data, str.m_data);
	return *this;
}
// 析构函数
inline MyString::~MyString()
{
	cout << "析构函数" << endl;
}
int main()
{
	MyString str1("hello world");// 拷贝构造MyString(const char* cstr = 0)
	MyString str2 = str1;// 【注意这里是拷贝构造】拷贝构造MyString(const MyString& str) 
	MyString str3(str1);// 拷贝构造MyString(const MyString& str)
	
	MyString str0; // 拷贝构造MyString(const char* cstr = 0)
	str0 = str1;// 【注意这里是拷贝赋值】拷贝赋值MyString(const MyString& str)
	
    return 0;
}

这里加如下自我检查的原因分析,后面再补充

// 检查自我赋值:(1) 提升效率 (2) 避免产生不确定的行为出错
	if (this == &str)
	{
		return *this;
	}

以上是关于C++面向对象编程的主要内容,如果未能解决你的问题,请参考以下文章

C++:面向对象设计的继承性的相关编程代码讲解

Arduino面向对象(C++)编程开发示例程序

C++:数据的封装,认识面向对象编程

《C++ Primer》之面向对象编程

C++作为面向对象语言的三个基本特征:封装,继承和————

OOP 面向对象编程:由 C语言到 C++