你真的学会C++了吗?
书籍推荐与习题
- C++ Primer Plus 第6版
- 链接:https://pan.baidu.com/s/1PrtcRBOTuHTaW2sjIhKrKA
- 提取码:rk1e
- 练习
- 链接:https://pan.baidu.com/s/1yX9unGUgBtsoTOYJQp5AGg
- 提取码:hgf2
结构体与类
- 结构体与类的区别
- 在C++中,结构体与类均由数据成员以及成员函数组成;在C中,结构体只有数据成员
- 默认情况下,结构体的成员是公有的,类的成员是私有的
- 类的数据成员初始化
- 构造函数直接赋值进行初始化
- 成员初始化列表进行初始化
- 用const修饰的数据成员
- 引用类型的数据成员
- 注意事项
- 数据成员是按照它们在类中声明的顺序进行初始化的,与它们在成员初始化列表中列出的顺序无关。
class A{
private:
int x;
int& rx;
const double pi;
public:
//成员初始化列表
A(int x1):x(x1),rx(x),pi(3.14)
{}
};
/*系统自动生成的拷贝构造函数*/
一一拷贝
/*用户自定义的拷贝构造函数*/
自定义实现功能
#include<iostream>
using namespace std;
class point{
public:
int x, y;
point(int a, int b) {
x = a;
y = b;
}
//系统自动生成的拷贝构造函数
/*point(const point& p) {
x = p.x;
y = p.y;
}*/
//用户自定义的拷贝构造函数
point(const point& p){
x = 2 * p.x;
y = 2 * p.y;
}
};
int main()
{
point p1(10, 20);
point p2(p1);
//point p2=p1;等价于point p2(p1);
cout << "p1.x=" << p1.x << ";" << "p1.y=" << p1.y << endl;
cout << "p2.x=" << p2.x << ";" << "p2.y=" << p2.y << endl;
return 0;
}
/*什么时候会调用拷贝构造函数*/
1 Point p2(p1);或者Point p2 = p1;
2 函数的形参是类的对象时
3 函数的返回值是类的对象时
-
为什么提出静态数据成员的概念?
- 为了实现同一个类的多个对象之间的数据共享
- 静态数据成员属于类,或者说属于类中一个对象集合
- 例如:数据成员
static int count;
在类外初始化int Student::count=0;
-
类的组合
#include<iostream>
using namespace std;
class A{
private:
int x;
float y;
public:
A(int x1, float y1){
x = x1;
y = y1;
}
void show() {
cout << "x=" << x << ";" << "y=" << y << ";" << endl;
}
};
class B {
private:
A a;
int z;
public:
B(int x1, float y1, int z1) :a(x1, y1)
{
z = z1;
}
void show(){
a.show();
cout << "z=" << z << ";" << endl;
}
};
int main()
{
B b(11, 22, 33);
b.show();
return 0;
}
- 不同对象如何存储?
- 不同对象的数据成员存放在不同的内存地址
- 所有对象的成员函数对应的是同一个函数代码段
- 每个对象占用的存储空间只是该对象的数据部分所占用的存储空间
继承
基类中的成员 | 在公有派生类下的访问属性 | 在私有派生类下的访问属性 | 在保护派生类下的访问属性 |
---|
私有成员 | 不可直接访问 | 不可直接访问 | 不可直接访问 |
公有成员 | 公有 | 私有 | 保护 |
保护成员 | 保护 | 私有 | 保护 |
基类中的成员 | 私有成员 | 公有成员 | 保护成员 |
---|
类内访问 | 不可访问 | 可访问 | 可访问 |
对象访问 | 不可访问 | 不可访问 | 不可访问 |
基类中的成员 | 私有成员 | 公有成员 | 保护成员 |
---|
类内访问 | 不可访问 | 可访问 | 可访问 |
对象访问 | 不可访问 | 可访问 | 不可访问 |
基类中的成员 | 私有成员 | 公有成员 | 保护成员 |
---|
类内访问 | 不可访问 | 可访问 | 可访问 |
对象访问 | 不可访问 | 不可访问 | 不可访问 |
- 那基类中的私有成员,我们真的没办法访问吗?当然不是啦!
- 为什么引入虚基类
- 引入虚基类之前,继承存在以下问题
B->B1->C<-B2<-B
- 在派生类C中如果调用基类B的成员变量等,会产生二义性,不知道是来自B1的还是B2的
- 可以使用
B1::成员变量
解决
- 使用虚基类也可以解决