面向对象程序设计-C++ Operator Overloading & Type conversion (Static)【第十一次上课笔记】

本次上课继续讲解了 [ ] 、-> 等运算符重载的具体例子

也讲解了C++单个参数的类的类型转换的案例

最后稍微提到了 static 的第三种作用:静态数据成员

具体详解我都已注释出来了,大家可以慢慢看

有任何问题都可以在这篇文章下留言我会及时解答 :)


#include <iostream>
#include <cmath>

using namespace std;

class myArray {
private:
    float * p;
    unsigned int size;
public:
    myArray (unsigned int len = 0);
    ~myArray ();
    unsigned int getSize () const;
    double moudar () const;

    const float & operator [] (int index) const; //下标运算符只能被重载在成员函数中
    float & operator [] (int index);             //Only member function
};

myArray::myArray (unsigned int len) {
    float * tmp = new float[len];
    if (NULL == tmp) {       //Check whether new work OK
        cout << "memory allocation error!" << endl;
        p = NULL;
        size = 0;
    } else {
        p = tmp;
        size = len;
        for (int i = 0; i < len; ++i) {
            p[i] = 0.0f;
        }
    }
}

myArray::~myArray () {
    if (NULL != p)  {
        delete [] p;
        size = 0;
    }
    p = NULL;               //保证析构后 p 指针为空
}

unsigned int myArray::getSize () const {
    return size;
}

double myArray::moudar () const {
    //float sum = 0.0f;
    double sum = 0.0;
    for (int i = 0; i < size; ++i) {
        float a = p[i];
        sum += a * a;
    }
    sum = sqrt (sum);
    return sum;
}

const float & myArray::operator [] (int index) const {
    return p[index];
}

float & myArray::operator [] (int index) {
    return p[index];
}

ostream & operator << (ostream & out, const myArray & ma) {
    int size = ma.getSize ();
    out << "{";
    for (int i = 0; i < size - 1; ++i) {
        out << ma[i] << ", ";
    }
    out << ma[size - 1] << "}" << endl;
    return out;
}

int main() {

    myArray ma(4);           //init one object
    double length = ma.moudar ();

    float element = ma[2];    //Get the element
    ma[3] = 12.5f;            //Update the element value
    ma[0] = 3.8f;

    cout << ma << endl;       //!! Only golbal function

    return 0;
}

// =  ()  []  ->  ->*   Only overloaded by member function

// << 在表达输出的时候,只能重载为全局函数;表达移位运算的时候,都可以

#include <iostream>

using namespace std;

class myClassA {
public:
    int i;
    myClassA (int k = 200) : i(k) { cout << "myClassA init" << endl; };
};

class myClassB {               //类B负责对其子对象创建,如果什么都不写,就是用默认
                               //构造函数创建,否则,需要在成员初始化列表写
public:
    int m;
    myClassA a;                //对象成员,创建B对象的时候,会先对A对象构造
    myClassA * operator -> ();
    //myClassB * operator -> ();

    myClassB (int j) : a(j), m(10) { cout << "myClassB init" << endl; };
};

/*
myClassB * myClassB::operator->() {
    cout << "myClassB * myClassB::operator->() " << endl;
    return this;
}
*/

myClassA * myClassB::operator->() {
    cout << " myClassA * myClassB::operator->() " << endl;
    return &a;
}

int main() {

    myClassB b (23);
    cout << b->i << endl;
    //cout << b->m << endl;

    return 0;
}

//C++单个参数的类的类型转换
//类的转化

#include <iostream>

using namespace std;

//class A;

class Integer {
    int i;
    //A a;
public:
    //explicit 的作用 : 告诉编译器,如果要转化,一定是显式

    explicit Integer (int k = 0) : i (k) { cout << "Integer (int k = 0)" << endl; }
    Integer & operator = (const Integer & obj);
    friend ostream & operator << (ostream & out, const Integer & ing);

    //operator A() { return a; }
    explicit operator int () { return i; }   //类型转换函数
    explicit operator double () { return i + 45.51; }   //类型转换函数
};

ostream & operator << (ostream & out, const Integer & ing) {
    out << ing.i << endl;

    return out;
}

Integer & Integer::operator = (const Integer & obj) {
    if (this == &obj)    return *this;   //检查自赋值
    i = obj.i;
    cout << "operator = (const Integer & obj) " << endl;
    return *this;
}

int main () {

    Integer a (45), b;
    b = Integer (63);
    cout << b << endl;

    int m = int (b);          //将Integer 类型转换成整形
    cout << m << endl;

    double d = double (b);
    cout << d << endl;

    return 0;
}

//static 静态数据成员

#include <iostream>

using namespace std;

class Integer {
    //static int i;
    static int number;  //整个类只有一个版本,所有对象共享
public:
    Integer (int k = 0) { ++number; }
    static int getNumber () const { return number; }
};

int Integer::number = 0;

int main () {

    Integer Zhao, jin, wei, shi, tian, cai;

    cout << Zhao.getNumber () << endl;
    cout << Integer::getNumber()<< endl;

    return 0;
}
时间: 2024-10-30 05:54:14

面向对象程序设计-C++ Operator Overloading & Type conversion (Static)【第十一次上课笔记】的相关文章

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

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

面向对象程序设计-C++ Inheritance &amp; Multiple inheritance &amp; RTTI【第十三次上课笔记】

Sadly, 这节课带过去的笔记本没电了 T^T 导致没有一行 Code, Sorry 笔记如下: 1 Shape * p1; //使用指针创建对象的方法 2 p = new Circle (2.0); 3 Shape * p2; 4 p = new Rectangle (3.0, 5.0); 5 6 class Shape { 7 public: 8 virtual double area () = 0; //Pure virtual function 9 } 10 11 //Warning:

面向对象程序设计-C++ Type conversion (Static) &amp; Inheritance &amp; Composition【第十二次上课笔记】

这节课继续讲解了 static 作为静态数据成员 / 成员函数的用法 具体详解我都已注释出来了,大家可以慢慢看 有任何问题都可以在这篇文章下留言我会及时解答 :) //static 静态数据成员 //static 静态成员函数 #include <iostream> using namespace std; class Integer { public: int i; static int number; //Declaration, 整个类只有一个版本,所有对象共享 //const stat

PHP面向对象程序设计中的self、static、parent关键字用法分析

这篇文章主要介绍了PHP面向对象程序设计中的self.static.parent关键字用法,结合实例形式分析了self.static.parent关键字功能.应用场景及相关使用技巧,需要的朋友可以参考下,本文实例讲述了PHP面向对象程序设计中的self.static.parent关键字用法.分享给大家供大家参考,具体如下:看到php里面有关于后期静态绑定的内容,虽然没有完全看懂,但是也收获不少东西.不存在继承的时候,不存在继承的意思就是,就书写一个单独的类来使用的时候.self和static在范

《数据结构与面向对象程序设计》第四周学习总结

20182304 2019-2020-1 <数据结构与面向对象程序设计>第四周学习总结 教材学习内容总结 1.本章我们学习了使用并编写我们自己的类:类中有与类同名的构造方法,也可以有set,get,toSring与自己定义的方法.实例化一个对象,可通过该对象使用类里的所有方法.实例数据是每次创造一个实例后自动生成新的内存空间的变量 2.uml类图 :每个类可能包含三部分内容:类名.属性.操作(方法).UML类图有属于自己的语法,变量的类型名在变量名的后面,它们之间用冒号作为分隔符,方法的+和-

5.4 SAP ABAP 面向对象概念 - 多态 - 摘自 《SAP ABAP面向对象程序设计:原则、模式及实践》

<SAP ABAP面向对象程序设计:原则.模式及实践> https://book.douban.com/subject/30317853/ http://www.duokan.com/shop/tbt/book/179473 https://item.jd.com/12423999.html https://e.jd.com/30429611.html 5.4 多态 5.4.1 多态的概述 多态是一个生物学和化学中的专有名词,被面计算机科学家引用到面向对象的程序设计中. 我们用柯林斯英语词典看

C# to IL 5 Operator Overloading(操作符重载)

Every operator overload that we use in C#, gets converted to a function call in IL. Theoverloaded > operator translates into the function op_GreaterThan and a + gets convertedto op_Addition etc. In the first program of this chapter, we have overloade

初探C++Primer(15.面向对象程序设计)

最近在恶补OOP相关知识,很遗憾学校的课没选上,于是只能上网购进C++Primer一本,开始重学C++之旅... (壮哉我大ZJU,网购半天到货XDD) 学习路线 7.类->13.类设计者的工具->15.面向对象程序设计 总的来说,C++Primer的章节编排顺序是很合理的.有些教材习惯上来就讲虚函数,继承,恰恰缺乏对有关问题的引导,造成学完后半懂不懂的情况. 7.类 类的特性,成员函数,友元函数,构造函数简介 13.类设计者的工具 拷贝构造函数,拷贝赋值运算符,析构函数,内存管理类,合成拷贝

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

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