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++面向对象编程的主要内容,如果未能解决你的问题,请参考以下文章