c++学习笔记之封装篇(上)

c++学习笔记之封装篇(上)

发表于    |   分类于 学习 , 程序员 , c/c++    |   暂无评论    |   阅读次数

一、类对象

假设我们由Tv这个类,定义如下

注意class结尾要加上分号

         
         
1
2
3
4
5
6
7
8
9
10
         
         
class Tv()
{
int width;
int height;
int volume;
void changeVolume()
{
//changeVolume
}
};

类的实例化有两种方法,一种是栈中实例化。另一种则是堆中实例化

而这两种方法除了在用法上有区别以外(区别见下面代码),内存管理也有区别(栈不用考虑内存回收问题,系统会自动回收,而堆则需要程序员主动释放内存)。

1.实例化
  • 从栈中实例化对象

                
                
    1
    2
    3
    4
    5
                
                
    Tv tv;
    或者
    Tv tv[ 20] //实例化对象数组 从栈中实例化系统自动回收内存
  • 从堆中实例化对象
    实例化一个对象后还需要判断是否成功申请到内存

                
                
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
                
                
    Tv *p = new Tv();
    Tv *q = new Tv[ 20]; //开辟一块对象内存
    if(p== NULL)
    {
    cout<< "类实例化失败"<< endl;
    }
    //从堆中实例化数组对象,需要程序员回收
    delete p;
    delete[]q;
    p = NULL;
    q = NULL;
访问数据
  • 通过栈实例化的对象访问数据成员:

                
                
    1
    2
                
                
    tv.volume = 5;
    tv.changeVolume();
  • 通过堆实例化的对象访问数据成员:

                
                
    1
    2
                
                
    tv->volume = 5;
    tv->changeVolume();

二、string

可以很方便的定义一个字符串,而不再是使用麻烦的char[].
使用方法:

          
          
1
2
          
          
// 引入string头文件
#include <string>

初始化方法

注意:第4个初始化方法中的第二个参数只能是一个字符,不能是字符串。

enter description here

string初始化.png

常用操作

enter description here

操作.png

对于字符串相加操作,需要注意一点,不能直接使用两个字符串相加,中间必须得有字符串变量连接才行(下面例子中最后一个赋值语句是错误的),具体例子如下:

enter description here

!.png

另外如果要将字符串和整数连在一起输出,则需要在整数前加上 << 进行处理,直接用 “+” 是无效的。

           
           
1
2
3
           
           
string name;
cin>>name;
cout<<name<<name.size()<< endl;

三、构造函数

  • 构造函数必须与类同名,起到的作用与python中的 init > _() 函数类似,即对类进行数据初始化。
  • 构造函数在对象实例化时被自动调用,且只调用一次。
  • 构造函数没有返回值,不需要return值。
  • 构造函数可以重载。
1. 构造函数分为有参与无参

举个栗子:

            
            
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
            
            
class Student
{
// 无参构造函数
Student()
{
m_iHeight = 180;
m_iWeight = 70;
}
// 有参构造函数
Student( int weight, int height)
{
m_iWeight = weight;
m_iHeight = height;
}
private:
int m_iWeight;
int m_iHeight;
}

2. 构造函数初始化列表

在初始化对象时,初始化列表是最先执行的,所以有的时候对于const变量我们也可以提前赋值。

语法:
类名():变量1(参数),变量2(参数){}

用法:
我们都知道一个人的身份证信息一般来说是不能随意篡改的,所以我们会使用const 来修饰,但是因为const修饰后,变量则不能再赋值,但是因为每个人的身份证又不一样,我们不可能在使用const修饰的同时进行赋值,那怎么办呢?所以这里用到了初始化列表来达到这么一个效果,详见下面的代码示例:

             
             
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
             
             
class Student
{
// 正确示例
// 初始化列表
Student( string id):m_iId(id)
{
// 初始化成功
}
// 编译会报错
// Student(string id)
// {
// m_iId = id;
// }
private:
const string m_iId;
}

初始化类数组

              
              
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
              
              
Coordinate *coorArr = new Coordinate[ 2]{{ 1, 2},{ 3, 4}};
```
具体示例
```cpp
#include <iostream>
using namespace std;
class Coordinate
{
public:
Coordinate( int x, int y):m_iX(x),m_iY(y)
{
cout<<m_iX<< ","<<m_iY<< endl;
}
// 打印坐标的函数
void printInfo()
{
cout<<m_iX<< ","<<m_iY<< endl;
}
private:
int m_iX;
int m_iY;
};
int main(void)
{
//定义对象数组
Coordinate *coorArr = new Coordinate[ 2]{{ 1, 2},{ 3, 4}};
//遍历数组,打印对象信息
for( int i = 0; i < 2; i++)
{
coorArr[i].printInfo();
}
return 0;
}

3. 拷贝构造函数
  • 不能重载
    格式:
    类名(const 类名& 变量名)

关于拷贝构造函数更具体的解析参考:
C++拷贝构造函数详解

4.析构函数

与构造函数相反,当一个对象的生命周期结束时,C++会自动调用一个特殊的成员函数,即析构函数进行善后工作,对成员变量所占内存进行释放操作。
格式:(不需要参数)
~类名(){}

               
               
1
2
3
4
5
6
7
               
               
class Student
{
// 构造函数,初始化列表
Student():m_iId( 110){};
// 析构函数,c++可以自动生成
~Student(){};
}

对象的生命历程:
申请内存–>初始化列表–>构造函数–>参与运算–>析构函数–>释放内存




坚持原创技术分享,您的支持将鼓励我继续创作!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值