C++面向对象编程

Posted Chris_166

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++面向对象编程

C++面向对象编程

侯捷P11面向对象编程

[C++ 面向对象高级编程]知识点补充1

[C++ 面向对象高级编程]string类的实现过程

[C++ 面向对象高级编程]Complex类的实现过程