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-08-24 20:16:22

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

[更新中]面向对象程序设计笔记

面向对象(object-oriented)程序设计 1 IDE的功能 2 关注的是对象,不是流程 对象可以是任何东西 面向对象既适用于设计,也适用于实现 对象里封装着方法,通过接口调用,即对象等于数据和包装数据的操作 对象之间交互的形式是消息Objects send message Messages are:1.Composed by the sender 2.Interpreted by the receiver 3.Implemented by methods Messages may ca

C++面向对象程序设计 笔记3 (面向对象部分)

一. 组合(复合),继承,委托 1.composition(组合)has-a 1.1 组合举例:(Adapter 设计模式) 关系: 利用deque功能实现所有queue功能 template <class T> class queue{ protected: deque<T> c; //deque 是两端可进出,queue是末端进,前端出 public: bool empty() const{ return c.empty;} size_type size() const{ re

JavaScript高级程序设计学习笔记--面向对象程序设计

工厂模式 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为解决这个问题,人们开始使用 工厂模式的一种变体. function createPerson(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name); }; return o; } var

C++ Primer笔记14_面向对象程序设计

OOP概述 面向对象程序设计(object-oriented programming)的核心思想是数据抽象.继承和动态绑定. 1.继承: 类的一种层次关系,通常在层次关系的根部有一个基类,其他类则直接或间接的继承基类而来.这些继承而来的类称为派生类. 基类希望它的派生类自定义适合自身的版本的函数,基类就将函数声明为虚函数,加上virtual关键字. 2.动态绑定: 通过动态绑定,可以使用同一段代码处理基类和子类对象. 在C++中,当我们使用基类的引用或指针调用一个虚函数时会发生动态绑定.有虚函数

面向对象程序设计-C++ Finial exam review NOTES【第十六次上课笔记】

写在前面: 我记得也不全,如果有记录的更全的同学可以留言,我会添加哒 :) 常量 内敛函数 为什么需要内敛函数 内敛函数适用于什么场合 内敛函数本身,最大优点是,避免了真正函数调用的开销 因为普通函数调用会有开销,比如开辟一个栈,结束了还要释放局部变量 如果函数体只有寥寥几行,是不值得使用函数 在函数体代码比较短小的时候,使用频繁的,应该使用内敛函数 最大优点:没有函数调用开销,又解决了带有参数宏的简单替换,它有类型检查 引用 什么是引用:给这块区域的数据再增加一个名称(本质含义) 表面上看,相

面向对象程序设计-C++ Stream &amp; Template &amp; Exception【第十五次上课笔记】

这是本门<面向对象程序设计>课最后一次上课,刚好上完了这本<Thinking in C++> :) 这节课首先讲了流 Stream 的概念 平时我们主要用的是(1)在屏幕上输入输出的 cin cout 流 (2)在文件中输入输出的 ifstream ofstream 流 (3)在字符串中输入输出的 istringstream ostringstream istrstream ostrstream 流 具体实例可以看以下代码: /***************************

{key}面向对象程序设计-C++ polymorphism 【第十三次上课笔记】

Peronal Link: http://segmentfault.com/a/1190000002464822 这节课讲了本门课程 面向对象程序设计中最为重要的一个部分 - 多态 1 /************************************************************************* 2 > File Name: polymorphism.cpp 3 > Author: Jeremy Wu 4 > Created Time: Mon 25

《C++primer(第五版)》学习之路-第十五章:面向对象程序设计

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 15.1 OOP:概述 1.面向对象程序设计的核心思想是数据抽象,继承和动态绑定.通过使用数据抽象,我们可以将类的接口与实现分离:使用继承,可以定义相似的类型并对其相似关系建模:使用动态绑定,可以在一定程度上忽略相似类型类型的区别,而以统一的方式使用它们的对象. 2.通过继承联系在一起的类构成一种层次关系.通常在层次关系的根部有一个基类,其他类则直接或间接地从基类继承而来,这些继承得到的类称