C++笔记(基础2):类与对象
1. 认识类与对象
-
什么是类(class)?
类(class)是类型(type),是用户自定义的类型。为什么不叫它type,因为借用Simula语言中的class关键字。 -
为什么要有类?
基于便利性的考虑,现实世界中物(object)通常被分为几种独立的分类。 -
基本概念
-
面向对象四大特征
2. 类的定义与对象创建
2.1 类的定义:与struct相似(C++)
class 类名{
成员变量成员函数声明
};
class
定义最后的;
一定不要忘记。
- 构成
- 实例:复数Complex
- 作用域运算符:: – 函数归属
- 访问限定符
实践中,成员变量多数情况使用
private
或者protected
,成员函数多数情况使用public
。通常,通过成员函数改变对象的成员变量。
- 类定义与类实现分离
- 头文件 – 声明
方式:#pragma once
或者#ifnde...#endif
作用:防止头文件二次编译 - 源文件 – 实现
引用头文件:#include <>
(标准库函数)/#include ""
(自定义/第三方函数)
在C++书籍中为了方便
.h
与.cpp
不做分离,但是项目开发中,需要分开。
-
强化练习:账单Bill(名称、数量、单价、小计)
-
class
与struct
区别
struct_class.cpp
#include <iostream>
using std::cout;
using std::endl;
struct SPos {
int x,y,z;
};
class CPos {
int x,y,z;
};
int main(){
#ifdef STRUCT
SPos spos = {
1,1,1};
cout << "(" << spos.x << "," << spos.y << "," << spos.z << ")" << endl;
#else
CPos cpos = {
1,1,1};
cout << "(" << cpos.x << "," << cpos.y << "," << cpos.z << ")" << endl;
#endif
}
C++class
与struct
区别是:
- 默认的访问控制不同
struct
是public
,class
是private
struct
可以使用花括号内的初始值列表{...}
初始化,class
不可以(C++98不可以,C++11可以)。
注意:
- C++的
struct
可以有成员函数,而C不可以。- C++的
struct
可以使用访问控制关键字(public private protected
),而C不可以。- C++的
struct
SPos spos; // C++
struct SPos spos; // C/C++
成员变量默认初始化为随机值(主要影响指针)。
2.2 对象创建/实例化
直接创建 – 类作为类型定义变量 – 栈上创建
- 例如:
基本类型
int main(){
int a = 10;
int b(10);
cout << a << " " << b << endl;
}
基本类型的初始化新增语法:
int a(0);// 等价 int a = 0;
const float b(1.0);// 等价 const float b = 1.0;
类类型
// 定义类
class Demo{
};
// 创建对象
int main(){
Demo d; // 变量(命名对象)
Demo(); // 匿名对象
}
- 基本语法
类名 对象名; // 调用默认构造函数
类名(); // 创建匿名对象
动态创建 – 堆上创建
- 例如
基本类型
int* p = new int;
delete p;
p = NULL;
类类型
// 定义类
class Demo{
};
// 创建对象
int main(){
Demo* d = new Demo;
delete d;
d = NULL;
}
- 基本语法
类名* 对象指针 = new 类名;// 调用默认构造函数
delete 对象指针;
对象指针new
可以为对象设置初始值,例如下面代码
int* p = new int(100);
cout << *p << endl;
动态创建数组 – 堆上创建
- 例如
基本类型
int* pa = new int[10];
delete pa;// 只释放p[0]
delete [] pa;// 释放全部数组
类类型
// 定义类
class Demo{
};
// 创建对象
int main(){
Demo* d = new Demo[10];
delete [] d;
d = NULL;
}
对象数组指针new
不可以为对象设置初始值。
int* pa = new int[10](100); // error: array 'new' cannot have initialization arguments
注意:C++除了特殊情况,很少直接使用
malloc()/free()
申请释放内存,取而代之的是new/delete
。
强化练习:银行与账户
空结构体与空类的大小(
sizeof
)为1
,主要在于初始化/实例化时,编译器给变量/对象分配内存(地址),内存最小单位为1个字节。
通常,sizeof(类型) == sizeof(变量)