首页 > 编程语言 >C++ 类和对象1

C++ 类和对象1

时间:2023-04-26 10:37:34浏览次数:36  
标签:定义 对象 成员 C++ 访问 类外 函数 struct

1. 初步认识面向对象与面向过程

C语言是面向过程的语言, 关注的是解决问题的过程

比如, 首先对问题进行拆解,然后用函数的方式对每个部分逐个实现,最后通过函数之间的相互调用将问题解决

C++是面向对象的, 关注的是对象, 如何从一个问题中抽离出不同的对象,然后靠对象之间的交互解决问题

最后需要注意的是: 面向对象和面向过程并不是程序设计语言而是解决问题的方式

2. 类的引入

在C语言中结构体只能包含变量, 而C++使用struct定义变量和函数, 如下图

如图, 在结构体Stack定义函数Init, 编译器没有报错, 这是因为C++把struct升级为了类

3. 类的定义

虽然可以用struct关键字来定义类, 但是在C++中更喜欢用class来定义

class定义类的语法

// 类名 test
class ClassName
{
	// 成员函数func
	void func()
	{
		cout << "test" << endl;
	}
	// 成员变量a
	int a;
};

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略

类体中内容称为类的成员:类中的变量称为类的属性或成员变量, 类中的函数称为类的方法或者成员函数

类定义的两种方式

1. 将类的声明和定义全部放在类中

typedef int DataType;
struct Stack
{
    void Init(size_t capacity)
    {
        _dys = (DataType*)malloc(sizeof(DataType) * capacity);
        if (nullptr == _dys)
        {
            perror("malloc申请空间失败");
            return;
        }

        _capacity = capacity;
        _size = 0;
    }

    DataType* _dys;
    size_t _capacity;
    size_t _size;
};

2. 在类中声明,将成员函数放在类外进行定义,但是注意放在类外定义的成员函数需要加类名::

(注)加类名::, 是告诉编译Init是Stack类中的一个成员函数

4. 类的实例化

使用类创建对象就是类的实例化

#include <iostream>
using namespace std;

struct test1
{
	void func()
	{
		cout << "test1" << endl;
	}
};

int main()
{
	test1 t1; // 用类实例化 对象t1
}

同时一个类可以创建多个对象

如何理解类和对象 ?

类只是用来描述对象的, 不会分配实际的内存空间,而对象是真正的实体,会占用实际的内存空间

可以把类理解为房子的建筑设计图, 而对象是房子实体, 房子的建筑设计图可以创建多个房子

5. 访问权限

首先看两个例子, 如下图

出现这个问题的原因是, class中定义的成员默认是私有的, 不能在类外使用类的成员

而struct定义的成员默认是公有的, 可以使用test1类中的成员函数func, 所以没有报错

 

解决这个问题, 只需要在类中声明一个访问限定符public, 表示类中的成员是共有的, 在类外可以使用, 如下图

接下来详解说明访问限定符

访问限定符分 public(共有), private(私有), protected(保护的)

  • public修饰的成员在类外可以直接被访问
  • protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  • 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  • 如果后面没有访问限定符,作用域就到}即类结束。
  • class的默认访问权限为private,struct为public(因为struct要兼容C)

 

标签:定义,对象,成员,C++,访问,类外,函数,struct
From: https://www.cnblogs.com/xumu11291/p/17353728.html

相关文章

  • 02 | C++lambda容易忽略的点
    1.模板化的lambda如果我们的lambda接收容器(假定我们老老实实的传入容器),并且要提取出容器中的元素类型,应该怎么做呢?之前我们可能这样做autof=[](autovector){usingT=typenamedecltype(vector)::value_type;///......}首先说这样做并不明显我们要传入的......
  • C++学习 第十二天
    今日学习内容:继承 多态 虚函数和抽象函数 继承:优点:可以实现代码复用,节省代码量分类:单继承 多继承 单继承:语法:class 子类类名:继承访问修饰符 父类类名{成员};父类:子类: 继承:继承修饰符:publicprotectedprivate当继承修饰是 public时 访问权......
  • C++ 学习 第十一天
    今日学习内容:面向对象 面向对象:优势:可以实现数据类型扩展易于理解 呈现形式:类 特性:封装:先将成员绑定为一个整体,再将被绑定成员划分权限,所以在类中,成员和成员直接不遵从代码顺序结构权限:public 公有的:类内可以访问 子类可以访问 类外可以访问privat......
  • 左值、左值表达式、左值引用 C++
     本文topics什么是左值和右值什么是左值表达式、右值表达式引用的分类之前学习Java的时候只记得在赋值表达式左边的就是左值,右边的就是右值。这个说法没有错,但今天又在C++中有学习到了关于左右值得概念,在此梳理了一些这些知识点。左值和右值左值:左值是一个对象或变量,可以代表......
  • C++数据结构(树)
    树是一种递归定义的数据结构,如果树中节点的各子树从左到右是有次序的,不能互换,则称该树为有序树,否则叫无序树。关于树的节点:节点拥有的子树的个数叫做节点的度如果度为0,那么该节点叫做叶节点或终端节点,除了根节点外的分支节点称为内部节点树的度是各节点度的最大值。节点的子......
  • C++ 多线程并发
    C++参考手册-并发支持库《C++ConcurrencyinAction》https://segmentfault.com/a/1190000040628584?utm_source=sf-similar-articlehttps://zhuanlan.zhihu.com/p/547312117bilibiliC++多线程并发基础入门教程1创建线程C++11之前原生不支持多线程,C++11起逐步引......
  • js遍历对象属性
    1、遍历要给json对象varjsObj={"name":"張三","age":18}for(varkeyinjsObj){console.log("key:"+key+",val:"+jsObj[key])}2、遍历数组vararr=newArray();arr.push(11);arr.push(22);arr.push(33);arr.forEach(i......
  • 用Winsock编写服务端和客户端 (C++)
      在这里先向大家推荐一本不错的入门书籍——《TCPIP网络编程》(尹圣雨著),这本书比较贴近实战,是一本不错的网络编程方向的指导用书。如果需要PDF版本,可以后台私信我! 回归正题,我们欲要使用C++实现一个简易的服务端和客户端控制台程序。代码如下:  服务端:/***************......
  • Django之视图函数层 (必会三板斧 JsonResponse对象 request对象获取文件 FBV与CBV
    目录视图层之必会三板斧用来处理请求的视图函数都必须返回HttpResponse对象情况一:啥也不返回这里会报一个没有返回HttpResponse对象的错误,由此可见必须要返回一个HttpResponse对象情况二:返回HttpResponse对象点击Ctrl键查看源码可见是HttpResponse类,所以会返回一个值情......
  • C++第四章课后习题4-12
    定义一个datatype类,能处理包含字符型,整形,浮点型3种类型的数据,给出其构造函数。1#include<iostream>2usingnamespacestd;34classDataType{5private:6chara;7intn;8floatx;9enum{10character,11intege......