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

这节课继续讲解了 static 作为静态数据成员 / 成员函数的用法

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

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

//static 静态数据成员
//static 静态成员函数

#include <iostream>

using namespace std;

class Integer {
public:
    int i;
    static int number;            //Declaration,    整个类只有一个版本,所有对象共享
    //const static int number = 49;        在C++中也可以这样定义,不过比较奇葩
    int geti () { return i; }    //名称混编: [email protected]_    _v (Integer * const this)
    Integer (int k = 0) : i(42) { ++number; }
    static int getNumber ();    //名称混编: [email protected]__v ()
};

int Integer::getNumber () {        //不需要写成static int Integer::getNumber
    //++i;    无法在静态成员函数中访问非静态成员
    //        非静态成员函数只能在静态成员函数中访问
    //this->i++;
    //        静态成员函数中无 this 指针
    return number;
}

int Integer::number = 0;//Definition

int main () {

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

    Zhao.i = 78;
    Zhao.number = 4;

    cout << Zhao.i << endl;

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

    return 0;
}

以下是 组合 的例子

组合就是一个 has a 的关系,非常好理解

/*************************************************************************
    > File Name: Code05.cpp
    > Author: Jeremy Wu
    > Created Time: Mon 18 May 2015 10:47:03 AM CST
 ************************************************************************/

#include <iostream>
#include <string>

using namespace std;

//class Building;    //类的前置声明
//Building *bd;    //前置声明无法创建对象,但可以创建指针

class Building {

};

class Student {
public:
    int xuehao;
    double chengji;
    string address;
};

class Campus {    //relation : A Campus has Building & Student
    Building bd;
    Student st;

};

int main (){

    return 0;
}

然后着重介绍了继承的相关概念

继承就是一个 is -a 的关系

/*************************************************************************
    > File Name: Code06.cpp
    > Author: Jeremy Wu
    > Created Time: Mon 18 May 2015 10:55:00 AM CST
 ************************************************************************/

//构造函数调用顺序
//先调用基类构造函数
//再创建成员
//最后调用派生类构造函数

#include <iostream>
#include <string>

using namespace std;

class Person {                        //Base class
private:
    string name, address;
    bool sex;
protected:                            //Protected, like private, but is avaiable in derived calss
    int age;
public:
    int getAge () { return age; }
    void setAge (int i) { age = i; }
    string getName () { return name; }
    void setName (string nm) { name = nm; }
    string getAdress () { return address; }
    void setAdress (string ar) { address = ar; }
    bool getSex () { return sex; }
    void setSex (bool sx) { sex = sx; }

    Person (string nm, string ar, int a, bool s)
        : name (nm), address (ar), age (a), sex (s) {
            cout << "Person (string nm, string ar, int a, bool s) is called" << endl;
        }
    ~Person () { cout << "~Person () is called" << endl; }
};

class Test {
public:
    Test () { cout << "Test () is  called" << endl; }
    ~Test () { cout << "~Test () is called" << endl; }
};

class Student : private Person {        //Derived class
                                    //relation : A student is a person
                                    //if private derived, all the public funcions will be private as well as member varible
    //Person ps;
    Test t;
    unsigned int id;
public:
    int getId () { return id; }
    int setId (unsigned int id) { this->id = id; }

    void addAge () { ++age;    }
    //void addAge () { setAage (getAge () + 1 ); } //low efficiency

    Student (string nm, string ar, int a, bool s, unsigned int xh)
        : Person (nm, ar, a, s), id (xh) {
            cout << "Student (string nm, string ar, int a, bool s, unsigned int xh) is called" << endl;
        }
    ~Student () { cout << "~Student () is called" << endl; }

};

class UniversityStudent : public Student {
    //void print () { getName (); } 基类需要保护继承
};

void print (Person *p) {
    cout << p->getAge () << endl
        << p->getName () << endl
        << p->getAdress () << endl
        << p->getSex () << endl;
        //<< p->setId () << endl;    //Object slice 对象剪切
}

int main () {

    Person ps ("Zhao jinwei", "U.S.A", 20, true);
    Student st ("Ph.D Zhao", "CHINA", 20, false, 1322);

    //cout << st.getAge () << endl;
    st.addAge ();
    //ps.addAge ();
    cout << st.getName () << " " << st.getAge () << endl; //派生类对象继承了基类中成员
    print (&st); 

    return 0;
}
时间: 2024-11-10 15:16:17

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

面向对象程序设计-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 流 具体实例可以看以下代码: /***************************

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

本次上课继续讲解了 [ ] .-> 等运算符重载的具体例子 也讲解了C++单个参数的类的类型转换的案例 最后稍微提到了 static 的第三种作用:静态数据成员 具体详解我都已注释出来了,大家可以慢慢看 有任何问题都可以在这篇文章下留言我会及时解答 :) #include <iostream> #include <cmath> using namespace std; class myArray { private: float * p; unsigned int size;

面向对象程序设计-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:

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

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

Java面向对象程序设计--与C++对比说明:系列3(Java 继承机制)

继承(inheritance)背后的核心思想是:可以在现有类的基础上创建自己的新类,在新类中继承原来类的方法和数据域,并添加适合当前应用场景的新的数据和方法. 1. 类,超类,子类 (class,superclass,subclass): Java 中的inheritance都是public inheritance,并不想C++中存在public,protected和private inheritance的分类. class subclass extends superclass; 这里有两个要

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

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

20182331 2019-2020-1《数据结构与面向对象程序设计》第6周学习总结

20182331 2019-2020-1 <数据结构与面向对象程序设计>第6周学习总结 教材学习内容总结 后绑定: 1.术语"多态性"可以理解为"有许多形式",一个"多态性引用"是可以在不同时间指向不同类型对象的引用变量.利用多态性调用的方法能够由一个调用改变为另一个调用. 2.在多数情况下,绑定发生在编译阶段,但对于多态性引用,这种绑定要延迟到程序运行时才能执行. 3.后绑定的效率低于编译阶段绑定效率,因为后绑定需要在程序执行期间决

20135234马启扬 实验二 Java面向对象程序设计

北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1352  姓名:马启扬  学号:20135234 成绩:             指导教师:娄嘉鹏    实验日期:2015.5.7 实验密级:         预习程度:         实验时间:15:50--22:50 仪器组次:34         必修/选修: 选修            实验序号:02 实验名称:实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和T