C++类设计2(Class with pointer members)

二 Class with pointer members(Class String)

1. 测试代码(使用效果)

int main()
{
    String s1(),
    String s2("hello");          //构造函数
    String s3(s1);               //拷贝构造
    cout << s3 << endl;
    s3 = s2;                     //拷贝赋值
    cout << s3 << endl;
}

2 Big three(三种特殊函数)

class String
{
public:
    String(const char* cstr = 0);
    String(const String& str); //参数为相同类型对象的引用,拷贝构造
    String& operator=(const String& str); //拷贝赋值
    ~String() //析构函数
    char* get_c_str() const{
        return m_data;
    }
private:
    char* m_data;
};

2.1 ctor & dtor(构造与析构)

inline
String::String(const char* cstr = 0)
{
    if(cstr){
        m_data = new char[strlen(cstr)+1];
        strcpy(m_data,cstr);
    }
    else{   //未指定长度
        m_data = new char[1];
        *m_data = ‘\0‘;
    }
}

inline
String::~String()
{
    delete[] m_data;
} 

2.2 Class with pointer members必须有copy ctor(拷贝构造)和copy op(拷贝赋值)

深拷贝与浅拷贝

深拷贝:

inline
String::String(const String& str){
    m_data = new char[strlen(str.m_data) + 1];  //直接取得另一个对象的private数据
                                                //可用友元解释
    strcpy(m_data, str.m_data);
}

拷贝赋值函数:

思路:若右边拷贝到左边,步骤为 清空左边;分配与右边相同空间;完成拷贝。

inline
String& String::operator=(const String& str){
    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
} 

总结:有指针变量的类,一定要重新其拷贝构造,拷贝赋值和析构函数!

时间: 2024-10-19 07:16:05

C++类设计2(Class with pointer members)的相关文章

C++面向对象程序设计 笔记1(Class without pointer members)

一.Class without pointer members (class complex) 1.防卫式声明 #ifndef _COMPLEX_ #define _COMPLEX_ ...... #endif 2.inline function 函数若在class体内完成定义,则自动成为内联函数候选人: 若在class外,需添加inline关键字;同时真正是否inline由编译器决定. class complex{ public: complex (double r = 0, double i

C++面向对象程序设计 笔记2(Class with pointer members)

二 Class with pointer members(Class String) 1. 测试代码(使用效果) int main() { String s1(), String s2("hello"); //构造函数 String s3(s1); //拷贝构造 cout << s3 << endl; s3 = s2; //拷贝赋值 cout << s3 << endl; } 2 Big three(三种特殊函数) class Strin

Android游戏之输入类设计(传感器,键盘,触摸点)

Android游戏之输入类设计(传感器,键盘,触摸点) 1.基础知识: A. SensorEventListener传感器事件监听 http://developer.android.com/reference/android/hardware/SensorEventListener.html Class Overview--------------------------------------------------------------------------------Used for

Android基类设计方法详解

1 为什么要设计基类 为什么要给程序设计基类呢?主要是出于2个原因,一是方便代码编写,减少重复代码和冗余逻辑,优化代码:二是优化程序架构,降低耦合度,方便拓展.修改. ok,编写代码是程序员的第一步,那么第二步就是要编写高质量的代码,代码能实现功能是一方面,写的优美则是另一方面,这也是我们所有攻城狮们应该追求的境界. 2 设计基类的基本思路 那么,哪些东西我们需要抽象到基类中呢? 2.1 重复的代码:如果一个逻辑是大多数子类都需要使用的 2.2 臭而长的代码:典型的findviewbyid.To

状态机在类设计中的应用

引言 在面向对象程序设计与分析的过程中最终都将把需要求分解为多个类再进行程序编码,因此类的设计是程序设计的基础,对于多数项目而言可以划分MVC的三层模型来进行实现.对应类的描述而言可以分如下三种类型的类设计 1>边界类:负责与用户进行交互,对于MVC中的View部分 2>控制类:负责业务逻辑处理,对于MVC中的C部分 3>实体类:负责对数据的抽象与存储部分,通常对应于数据库的表,对于MVC中的M部分

类设计中几种继承方式

 通过继承能够从已有的类派生出新的类,而派生类继承了基类的特征,包括方法.正如继承一笔财产要比自己白手起家容易一样,通过继承派生出的类通常比设计新类要容易得多.下面是可以通过继承完成的一些工作. ①可以在已有类的基础上添加功能. ②可以给类添加数据. ③可以修改类方法的行为. C++有三种继承方式:公有继承.保护继承和私有继承. 一.公有继承 公有继承是最常用的方式,它建立一种is-a关系,即派生类对象也是一个基类对象,可以对基类对象执行的任何操作,也可以对派生类对象执行. ①公有继承不建立

四类设计人员

转载:四类设计人员 个人觉得设计人员可以分为四种类型:模块设计人员.框架设计人员.专业领域设计人员.系统设计人员,这四种类型的设计人员并没有什么绝对的谁强谁弱,只能说各有千秋吧,但一定程度上来讲,四种类型之间还是存在着一些关联,来看看这四类设计人员的专注点和关联吧:1.模块设计人员      模块设计人员更加专注于模块的详细设计方面,这是个细活来着,模块设计人员需要对基于架构的模块实现有充足的考虑,而这就要求模块设计人员在代码的实现上有充足的经验,需要把握在模块代码实现上可能碰到的问题,在设计时

iOS控制器之基类设计

题记 在进入新公司后.经过这一个月的重构项目,终于把项目做到了个人相对满意的程度(还有一种不满意的叫老板的需求,提过多次意见也没用= =!).在这次重构中按照以前的思路设计出了个人觉得比较适用的一个基类.在这里笔者会把此基类基本的设计说明一遍. 基类设计需求 1.在我们搭建框架之初一般会设计一个ViewController基类,并在基类ViewDidLoad中设置一个随机的背景颜色.并通过touch手势来进行界面的跳转,以此来设计最开始的一个界面跳转框架,并通过界面颜色的变幻来验证我们界面跳转是

《C++沉思录》——类设计核查表、代理类、句柄类

<C++沉思录>集中反映C++的关键思想和编程技术,讲述如何编程,讲述为什么要这么编程,讲述程序设计的原则和方法,讲述如何思考C++编程. 一.类设计核查表 1.你的类需要一个构造函数吗? 2.你的数据成员都是私有的合理吗? 3.你的类需要一个无参的构造函数吗? 是否需要生成类对象的数组! 4.你的每一个构造函数都初始化所有的数据成员了吗? 虽然这种说法未必总是正确,但是要积极思考! 5.你的类需要析构函数吗? 6.你的类需要一个虚析构函数吗? 7.你的类需要一个拷贝构造函数吗? 8.你的类需