前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面向对象

面向对象

作者头像
DeROy
发布2020-05-11 17:48:51
5910
发布2020-05-11 17:48:51
举报
文章被收录于专栏:编程学习基地编程学习基地

面向对象

前言

C++里面有句经典台词:

女朋友是new出来的,儿子是继承过来的

这期介绍C++面向对象的知识点,带你面向对象,今天是情人节,不用担心没对象,new一个,有了对象就会累(类),所以我还会介绍类

面向对象三个步奏:定义对象,创建对象,使用对象

本期知识简单地定义了一个女朋友类,然后创建girl对象,最后使用对象introduce

最后祝大家情人节快乐~

目录

new和delete申请释放内存分配多个内存动态分配内存类和对象访问类型限定符类和结构体区别封装定义一个女朋友类string类头文件使用字符串对象 string类创建对象

new和delete

在学习C++的过程中,有一套区别于C的内存分配,这个就是new和delete这两个关键字

申请释放内存
代码语言:javascript
复制
#include<iostream>
using namespace std;
int main()
{
    //申请内存
    int *p1 = (int *)malloc(sizeof(int));
    *p1 = 1;
    int *p2 = new int;
    //int *p2 = new int(2); //分配内存的同时初始化
    *p2 = 2;
    cout << *p1 << " " << *p2 << endl;
    //释放内存
    free(p1);
    delete p2;
    return 0;
}
分配多个内存
代码语言:javascript
复制
#include<iostream>
using namespace std;
int main()
{
    int *p3 = new int[3];               //分配多个内存
    //int *p3 = new int[3]{ 1,2,3 };    //分配内存的同时初始化
    for (int i = 0; i < 3; ++i)
    {
        p3[i] = i;
        cout << p3[i] << ' ';
    }
    cout << endl;
    delete[] p3;    //释放内存
    return 0;
}

注意:

  • 这里需要注意的是分配内存并初始化时使用的是花括号
  • delete[] 指针用来释放多个内存
动态分配内存
代码语言:javascript
复制
#include<iostream>
using namespace std;
//数组指针作为函数返回值    列为固定值的受限动态内存分配
int(*create(int row))[3]
{
    int(*p)[3] = new int[row][3];
    return p;
}
int main()
{
    //受限制的动态内存分配
    int(*p4)[3] = create(4);
    int index = 1;
    for (int i = 0; i < 4; ++i)
    {
        for (int j = 0; j < 3; j++)
        {
            p4[i][j] = index++;
            cout << p4[i][j]<<" ";
        }
    }
    cout << endl;
    delete[] p4;
    return 0;
}
  • 这里就比较有意思了,当函数返回值为数组指针时,函数怎么写,大部分人是一脸懵逼的,这是声明一个返回数组指针的函数 int (*create(int row))[3]
  • delete[] p4一定要记得加[]

类和对象

什么是对象:万物皆对象,拥有相同属性和行为的一组对象 有了对象之后就会累(类),那什么类:类是现实世界对象的抽象,对象是类虚拟世界的实例

简单表示就是:类是一种用户自定义的数据类型,包括表示属性的成员变量和表示行为的成员函数

说到面向对象就不得不提面向对象的三大特性:

封装、继承 和 多态

类的关键字是:class

在对class描述之前需要了解到一个规则:访问控制权限

既然有访问控制权限,那就有访问类型限定符

访问类型限定符
  • public 共有成员

谁都可以访问(使用/调用)

  • protected保护成员

只有自己和子类可以访问

  • private 私有成员

只有自己(类内部)可以访问

类和结构体区别

在C++中,类和结构没有本质区别,唯一不同在于

类的默认访问控制属性为private

结构的默认访问控制属性为public

封装

对不同成员的控制访问属性加以区分,体现了C++作为面向对象语言的封装特性

定义一个女朋友类

接下来就是类的介绍了,今天是情人节,所以我们定义一个女朋友类

代码语言:javascript
复制
class GirlFrend
{
    //属性 成员变量
    char m_name[20];
    int m_age;
    int m_height;
    char m_job[20];
public:
    //行为  成员函数
    void Introduce();
    void Sleep();
    void Eat();
    void SetInformation(char* name, int age, int height, char* job);
};

作为类,我们需要有属性和行为,也就是成员变量和成员函数

在这里是类内声明,类外定义

代码语言:javascript
复制
void GirlFrend::Introduce()
{
    cout << "你好!我叫" << m_name << "我今年" << m_age << "岁,身高" << m_height << ",我的职业是" << m_job << endl;
}

void GirlFrend::Sleep()
{
    cout << "睡觉觉~" << endl;
}

void GirlFrend::Eat()
{
    cout << "吃饭饭~" << endl;
}

void GirlFrend::SetInformation(char* name, int age, int height, char* job)
{
    strcpy(m_name, name);
    m_age = age;
    m_height = height;
    strcpy(m_job, job);
}

然后呢在主函数里面创建你的女朋友对象,并初始化你的女朋友

代码语言:javascript
复制
int main()
{
    //栈区对象
    GirlFrend girl;
    girl.SetInformation("女朋友", 18, 165, "白衣天使");
    girl.Introduce();
    girl.Sleep();
    girl.Eat();
    //堆区对象
    GirlFrend* myGirl = new GirlFrend;
    myGirl->SetInformation("女朋友", 18, 160, "白衣天使");
    myGirl->Introduce();
    myGirl->Sleep();
    myGirl->Eat();
    return 0;
}

运行结果:

代码语言:javascript
复制
你好!我叫女朋友我今年18岁,身高165,我的职业是白衣天使
睡觉觉~
吃饭饭~
你好!我叫女朋友我今年18岁,身高160,我的职业是白衣天使
睡觉觉~
吃饭饭~

在行为里面有一个函数用来设置对象,为什么不直接赋值,而要定义这样一个函数来初始化对象。

因为class这个关键字的默认访问控制属性为private,意味着只有这个类自己和子类可以访问m_name,m_age这些变量,这个就体现了C++作为面向对象语言的封装特性,我有这个东西,可如果不是我和我儿子,谁都别想访问,就是这么霸道

string类

C++在对字符串的操作上提供了string类

在C里面我们是如何使用字符串的呢

代码语言:javascript
复制
    //使用字符数组
    char str[] = "hello";
    //使用字符指针
    char* s = (char*)"world";
    //直接使用字符常量
    printf("hello world\n");

在C++里面是这样使用字符串的

头文件
代码语言:javascript
复制
#include<string>    //注意不是string.h
使用字符串对象 string类创建对象
代码语言:javascript
复制
#include<iostream>
#include <string>
using namespace std;    //string在命名空间 std 里面
int main()
{
    //创建string类对象
    string s1 = "123";
    string s2("abc");
    string* s3 = new string("xyz");
    //赋值
    s1 = s2;   //相比C strcpy 更方便
    //比较
    if (s1 == s2)
    {
        cout << "s1 = s2" << endl;
    }
    //拼接
    s1 = s1 + "456";
    s1.append("789");
    s1.push_back('!');
    cout << s1 << endl;
    //交换
    s1.swap(s2);
    cout << s1 << " " << s2 << endl;
    //字符串长度
    cout << s2.size() << endl;
    //查找 替换
    cout << s2.find("456", 0) << endl;
    s2.replace(s2.find("456", 0),   //第 n 个位置开始替换
        3,                          //替换的字符数量
        "888");                     //替换的字符串
    cout << s2;
    return 0;
}

运行结果

代码语言:javascript
复制
s1 = s2
abc456789!
abc abc456789!
10
3
abc888789!

对于string类的使用还有很多,最好的学习string类的方法就是自己去实现string类,当然,这比较繁琐,但是非常锻炼基础知识,实现string类需要用到后面的知识,这里就简单地介绍下string类


编辑:梦凡

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程学习基地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • new和delete
    • 申请释放内存
      • 分配多个内存
        • 动态分配内存
        • 类和对象
          • 访问类型限定符
            • 类和结构体区别
              • 封装
                • 定义一个女朋友类
                • string类
                  • 头文件
                    • 使用字符串对象 string类创建对象
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档