类访问修饰符和指向类的指针
类访问修饰符
数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。类成员的访问限制是通过在类主体内部对各个区域标记 public、private、protected 来指定的。关键字 public、private、protected 称为访问修饰符。
public
公有成员在程序中类的外部是可访问的。您可以不使用任何成员函数来设置和获取公有变量的值
private
私有成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有类和友元函数可以访问私有成员。
默认情况下,类的所有成员都是私有的。
procted
protected(受保护)成员变量或函数与私有成员十分相似,但有一点不同,protected(受保护)成员在派生类(即子类)中是可访问的。
继承中的特点
有 public, protected, private 三种继承方式,它们相应地改变了基类成员的访问属性。
1.public 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:public, protected, private
2 ...
拷贝构造函数
非常感激我队友大爹给我的复习资料
拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。
如果在类中没有定义构造拷贝函数,编译器会自行定义一个。如果类带有指针变量,并有动态分配内存,则它必须有一个拷贝构造函数。拷贝构造函数的最常见形式如下:
123classname (const classname &obj) { // 构造函数的主体}
具体示例
1234567891011121314151617181920212223242526272829303132333435363738394041#include <iostream>using namespace std;class Example{ private: int a; public: // 构造函数 Example(int b) { a = b; } // 拷贝构造函数 Example(const Example& ...
友元函数
定义
类的友元函数定义在类外部,但有权访问类的所有private成员和protected成员。
尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类以及所有成员都是友元。
如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字friend,如下所示。
12345678class Box { double width;public: double length; friend void printWidth( Box box ); friend class ClassTwo; void setWidth( double wid );};
示例
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include <iostream>using namespace std;class Box ...
static用法
非常感激我队友大爹给我的复习资料
静态局部变量
在局部变量前, 加上关键字static,该变量就被定义成一个静态局部变量。
通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存, 但随着程序退出函数体,系统就会收回栈内存, 局部变量也相应失效,但有时我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序维护带来不便。
静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用直到下次重新赋值。
1234567891011121314151617void fn(){ static int n = 10; cout << n << endl; n++;}fn();fn();fn();/*========输出结果:101112========*/
特点
静态局部变量具有以下特点:
该变量在全局数据区分配内存
静态局部变量在程序执行到该对象的声明处时被首次初始化 ...
析构函数
非常感激我队友大爹给我的复习资料
什么是析构函数
类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。
一个类内可以有多个构造函数,可以是一般类型的,也可以是带参数的,相当于重载构造函数。但是析构函数只能有一个。
析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀。
定义方式:~类名(无参数){}
示例代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354#include <iostream>using namespace std;class Matrix{ private: int row; int col; public: Matrix(int r, int c); Matri ...
类初始化常量成员和引用成员
非常感激我队友大爹给我的复习资料
凡是有引用类型的成员变量或者常量类型的变量的类,不能有缺省构造函数。
默认构造函数没有对引用成员提供默认的初始化机制,也因此造成引用未初始化的编译错误。
并且必须使用初始化列表进行初始化const对象、引用对象。
直接赋值报错
1234567891011121314151617181920212223242526272829303132333435363738#include <iostream>using namespace std;class A{ private: int & a; int _b; public: A(int target, int b) : a(target), _b(b){ cout << "Constructor Function" << endl; } // A(int target, int b) { ...
类构造函数初始化列表
非常感激我队友大爹给我的复习资料
定义格式
构造函数初始化列表以冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟着一个放在括号中的初始化式。
123456789class Example{ public: int a; float b; // 构造函数初始化列表 Example() : a(0), b(8.7) {} // 构造函数内部赋值 // Example() {a = 0; b = 8.7;}};
初始化顺序
C++初始化类成员时, 是按照声明的顺序初始化的, 而不是按照出现在初始化列表中的顺序。
以下面的顺序为例:
1234567class Test {public: int _a, _b; Test(int a, int b) : _b(b), _a(_b) {}};cout << tt._a << " " < ...
多维数组传参与赋值
非常感激我队友大爹给我的复习资料
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include<bits/stdc++.h>using namespace std;void print_1(const int (*a)[3], const int& n) { for (int i = 0; i < n; i++) { for (int j = 0; j < 3; j++) { cout << a[i][j] << " "; } cout << endl; } cout << endl;}void print_2(const int a[][3], const int& n) { fo ...
attacklab-rtarget(未完成)
写在前面
官方文档https://csapp.cs.cmu.edu/3e/attacklab.pdf
和ctarget不同,rtarget程序引入了常见的栈保护机制,如栈随机化,使得程序运行的地址是不确定的。这样便无法通过注入代码(写指令)的方式攻击程序。
但是办法总比困难多。有些人想出了一个叫“断章取义”的办法来攻击程序。即在指令集中截取某一部分指令(掐头不去尾),这部分指令的意思可能会发生变化,然后我们就利用这部分现有的指令去攻击程序。
以官方文档给出的例子为例:
12400f15: c7 07 d4 48 89 c7 movl $0xc78948d4,(%rdi)400f1b: c3 retq
如果只截取48 89 c7这段指令的话,那么我们就生成了一个全新的指令:movq %rax, %rdi
实验作者已经把这些可能有帮助的指令全都放到了rtarget的start_farm和mid_farm中间。
1234567891011121314151617181920212223242526272829303132333435363738390000000000401994 < ...
作业2
P166 5.3
通常,类型与子类型之间的继承关系,反映出“is-a”的关系。例如,具有范围检验能力的ArrayRC是一种Array,Book是一种LibraryRentalMaterial,AudioBook是一种Book…以下各组说法,哪一些反应了“is-a”的关系?
member function是一种函数?✅
member function是一种class? ❌
construction是一种成员函数?✅
飞机是一种交通工具?✅
引擎是一种卡卡车?❌
圆形是一种几何形状?✅
正方形是一种矩形?✅
汽车是一种飞机?❌
借阅者是一种图书馆?❌
P166 5.4
图书馆提供以下出借馆藏分类,每一种都有自己的借出与归还方式。请将它们组织成一个继承层次体系:
library_lending_material
book
audio book
rental book
CD-ROM book
children’s puppet
record
video
video game
Sega
Sony Playstation
Nintenio
P189 6.1
试改写以 ...