C++总结篇(2)类和对象

1、类

1.1类的定义:
C++是一门面向对象的语言,便就引入了类的概念,类在一定程度上与C语言中的结构体很相似。Class为定义类的关键字,如下示例:

class  student
{char name[10];int age;int  print();
};

类不仅可以用class来定义,还可以用struct定义,因为C++完全包含C语言,二者不同的是,再类中没有访问限定时,class默认private访问方式,struct默认public访问方式。

1.2类的使用:
类的成员都在类的作用域中,在外部无法直接调用,需要使用作用域解析符,示例如下:

class  student
{
public:char name[10];int age;void  print();
};
void student::print()
{cout << age << endl;
}

1.3类的大小:
类与结构体一样,都有大小,即所有成员大小之和,但仍遵守内存对齐原则,空类的大小为1个字节。内存对齐规则如下:

  1. 第一个成员在与结构体偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 注意:对齐数 =编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的对齐数为8,gcc中的对齐数为4
  3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是 所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

1.4类的访问方式:
private(私有):在类外不能调用
public(公有:可在类外调用
proteted(保护):在类外不能调用

访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

2、this指针

2.1作用:
如果一个类定义了很多个对象,在调用某个对象中的成员函数来访问某一变量时,都是通过指针来访问的,编译器自动给成员函数添加了一个指针参数,这个指针便是this指针,其指向需要访问的变量。
2.2this指针特性:

  1. this指针的类型:类类型* const
  2. 只能在“成员函数”的内部使用
  3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this 形参。所以对象中不存储this指针。
  4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

3、构造函数

3.1概念
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员 都有 一个合适的初始值,并且在对象的生命周期内只调用一次。
3.2 特性:

  1. 函数名与类名相同。
  2. 无返回值。
  3. 对象实例化时编译器自动调用对应的构造函数。
  4. 构造函数可以重载。
  5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定 义编译器将不再生成。
  6. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。

3.3 示例:

class  A
{
public:A(int x, int y){a = x;b = y;}void print(){cout << a << " " << " " << b << endl;}
private:int a;int b;
};
int  main()
{A a(1,2);a.print();system("pause");return  0;
}

4、析构函数

4.1 概念:
与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而 对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。析构函数也是特殊的成员函数。
4.2 特性:

  1. 析构函数名是在类名前加上字符 ~。
  2. 无参数无返回值。
  3. 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
  4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。

4.3 示例:

class  A
{
public:A(int x, int y){a = x;b = y;ptr = (int *)malloc(sizeof(int));}~A(){if (ptr){free(ptr);ptr = nullptr;}a = 0;b = 0;}
private:int a;int b;int *ptr;
};

5、拷贝构造函数

5.1概念:
只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象 创建新对象时由编译器自动调用。
5.2 特性:

  1. 拷贝构造函数是构造函数的一个重载形式。拷贝构造函数的参数

  2. 只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。

    5.3 示例:

class  A
{
public:A(int x, int y){a = x;b = y;ptr = (int *)malloc(sizeof(int));}A(const A& d){a = d.a;b = d.b;}
private:int a;int b;int *ptr;
};

6、赋值运算符重载

6.1 概念:
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数名字为:关键字operator后面接需要重载的运算符符号。
6.2规则:

  1. 不能通过连接其他符号来创建新的操作符:比如operator@
  2. 重载操作符必须有一个类类型或者枚举类型的操作数
  3. 用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不 能改变其含义
  4. 作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的
  5. 操作符有一个默认的形参this,限定为第一个形参 .* 、:: 、sizeof 、?: 、。

6.3 示例:

class  A
{
public:A(int x, int y){a = x;b = y;ptr = (int *)malloc(sizeof(int));}bool operator==(const A &d1){return (d1.a == a&&d1.b == b);}
private:int a;int b;int *ptr;
};

7、友元函数

7.1 概念:
友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声 明,声明时需要加friend关键字。
7.2 特性:

  1. 友元函数可访问类的私有成员,但不是类的成员函数

  2. 友元函数不能用const修饰

  3. 友元函数可以在类定义的任何地方声明,不受类访问限定符限制

  4. 一个函数可以是多个类的友元函数

  5. 友元函数的调用与普通函数的调用和原理相同

    7.3 示例:

class  A
{
friend  void print(const A& d);
public:A(int x, int y){a = x;b = y;}
private:int a;int b;
};
void print(const A& d)
{cout << d.a << " " << d.b << " " << endl;
}

8、友元类

8.1 概念:
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
8.2 特性:

  1. 友元关系是单向的,不具有交换性。
  2. 比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time
  3. 类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
  4. 友元关系不能传递,如果B是A的友元,C是B的友元,则不能说明C时A的友元
  5. 友元类需要前置声明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序 || 语句_C ++条件语句| 查找输出程序| 套装1

小程序 || 语句Program 1: 程序1&#xff1a; #include <iostream>using namespace std;int main(){if (NULL) {cout << "Hello World";}else {cout << "Hii World";}return 0;}Output: 输出&#xff1a; Hii WorldExplanation: 说明&…

关于微信,运营商们就这点志向?

2019独角兽企业重金招聘Python工程师标准>>> 近期关于运营商威逼微信收费之事闹得沸沸扬扬&#xff0c;在虎嗅上看到有不少人发表了自己的看法也不乏给运营商或微信出点子的人&#xff0c;但我觉得都不是很妥&#xff0c;还是谈谈我的看法吧。 陈旧的思路&#xff…

阿里巴巴开源的Excel操作神器!

前提导出数据到Excel是非常常见的后端需求之一&#xff0c;今天来推荐一款阿里出品的Excel操作神器&#xff1a;EasyExcel。EasyExcel从其依赖树来看是对apache-poi的封装&#xff0c;笔者从开始接触Excel处理就选用了EasyExcel&#xff0c;避免了广泛流传的apache-poi导致的内…

再谈指针

C语言为什么高效&#xff1f;因为C语言有指针。指针是C语言的精华&#xff0c;同时也是C语言的难点&#xff0c;很多人一学到指针就表示头大&#xff0c;指针的指向往往把人搞得晕头转向&#xff0c;甚至有的人为了避免使用指针居然不惜多写几十行代码&#xff0c;无疑增加了工…

vc给exe更改图标

第一步&#xff1a;将制作好的ioc格式图标&#xff0c;拷贝到自己工程所在的res文件夹中第二步&#xff1a;在vc开发环境中&#xff0c;insert-->resourse--〉单击icon然后选择右边的import找到刚才添加到res中的图标文件第三步&#xff1a;将m_hIcon AfxGetApp()->Load…

人工智能ai知识_人工智能中基于知识的代理层

人工智能ai知识Every agent that has a knowledge base and an inference system is known as a knowledge-based agent. The knowledge base contains all the information the agent has. This information can either be the data that is embedded into the agent in prior…

Word 2003中为什么修改一个段落的文章结果整篇文档的格式都变?

问题比如说&#xff0c;我选定某一段把颜色改成***&#xff0c;结果整篇文档都变成***了&#xff0c;按撤退健&#xff0c;才能达到效果&#xff08;只有这段变成***&#xff0c;其他的不变&#xff09;。答案打开格式菜单中的[样式和格式]&#xff0c;找到样式中的“正文”。 …

链表反转的两种实现方法,后一种击败了100%的用户!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;链表反转是一道很基础但又非常热门的算法面试题&#xff0c;它也在《剑指Offer》的第 24 道题出现过&#xff0c;至于它有多…

C++总结篇(4)内存管理

C语言中用malloc/realloc/calloc/free进行空间的申请与释放&#xff0c;在C中用新的方式进行空间的申请与释放。 申请一个int型的空间并释放 //C语言&#xff1a;int *ptr(int)malloc(sizeof(int));free(ptr); //C: int *ptr new int;delete ptr; C的申请方式更为简洁方便&…

debug和release的区别

1。Debug和Release有什么区别&#xff0c;为什么要使用Release版本&#xff01; 2。怎么把Debug转成ReleaseDebug版本包括调试信息&#xff0c;所以要比Release版本大很多&#xff08;可能大数百K至 数M&#xff09;。至于是否需要DLL支持&#xff0c;主要看你采用的编译选项。…

人工智能ai 学习_人工智能中学习代理的要素

人工智能ai 学习As already discussed, the Learning agents have the capability to improve their knowledge base by Learning from their surroundings by themselves, without any help or input from the user or the client. 如已经讨论的那样&#xff0c; 学习代理可以…

squid代理服务器(捎带的SNAT)

1.传统代理传统代理可以隐藏IP地址 多用于Internet 在Linux中 默认没有安装squid 所以要安装 在red hat中 还要安装perl 语言包的支持 squid代理服务器需要两块网卡 首先保证你的流量是从linux服务器上过的 所以先保证做完SNAT可以互相通信1&#xff09;配置网络参数在试验中一…

MySQL开源工具推荐,有了它我卸了珍藏多年Nactive!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;最近无意间发现了一款开源免费的 MySQL 客户端管理工具&#xff0c;磊哥试用了两天感觉还行&#xff0c;所以今天推荐给各位…

C++总结篇(3)String类

string是表示字符串的字符串类&#xff0c;该类的接口与常规容器的接口基本相同&#xff0c;再添加了一些专门用来操作string的常规操作。string在底层实际是&#xff1a;basic_string模板类的别名&#xff0c;typedef basic_string<char, char_traits, allocator> strin…

memoryTraining记忆训练小游戏

无聊的时候用C写了一个记忆训练的小游戏、、、 灵感源于一个flash的小游戏学到C语言就用C语言实验了一下&#xff0c;做出来。好久以前的东西了&#xff0c;数组用的还不咋样&#xff0c;现在看看把数组下标0漏掉了、、、掉了修补了修补&#xff0c;先扔这儿吧。源码下载

动态调用动态库方法 .so

2019独角兽企业重金招聘Python工程师标准>>> 关于动态调用动态库方法说明 一、 动态库概述 1、 动态库的概念 日常编程中&#xff0c;常有一些函数不需要进行编译或者可以在多个文件中使用&#xff08;如数据库输入/输 出操作或屏幕控制等标准任务函数&#…

C++总结篇(5)vector

vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而且它的大小会被容器自…

清除缓存 c语言_如何用C语言设置,清除和切换单个位?

清除缓存 c语言Given a number and we have to 1) set a bit, 2) clear a bit and 3) toggle a bit. 给定一个数字&#xff0c;我们必须1)设置一个位&#xff0c;2)清除一个位&#xff0c;3)切换一个位。 1)设置一点 (1) Setting a bit) To set a particular bit of a number,…

算法图解:如何找出栈中的最小值?

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;前面我们学习了很多关于栈的知识&#xff0c;比如《动图演示&#xff1a;手撸堆栈的两种实现方法&#xff01;》和《JDK 竟然…

数据库概况

New Words & Expressions:facilitate 使容易&#xff0c;促进retrieval n. 检索field n. 字段record 记录&#xff0c;alphabetically 按字母顺序地chronologically 按年代顺序排break down v. 分解build up 建造&#xff0c;装配&#xff0c;组成encyclopedia n. 百科全书…