- 博客(138)
- 收藏
- 关注
原创 C++基类与派生类
class : private:派生类新增成员;protected:派生类新增成员;public:派生类新增成员;说明:(1)class:类声明的关键字;(2)派生类名:新(派生)类名;(3)继承方式:指出继承的方式是什么。继承方式包含以下3种。• public(公有继承方式)使用的最多;• private(私有继承方式);• protected(保护继承方式)。用来说明对于从基类继承来的成员的访问权限,这个稍后介绍。
2024-06-03 23:52:27
2418
原创 C++类的继承与派生概念
如谈论“白猫”时,它也是猫,只不过增加了一个新的特征,即它的毛是白色的。“白猫”是一类特殊的“猫”,“白猫”从“猫”那里继承了“猫”的全部特征,同时又增加了一个新特征。可以定义描述“猫”的类 cat 和“白猫”的类 whitecat ,为了准确描述这两个类之间的关系,C++提供了一种继承和派生机制,在这种机制下,类whitecat自动拥有类cat的所有成员,该类的每一个对象都是类cat的对象,也就是实现了“每一个白猫都是猫”。(2)如果某个类的直接基类有两个或两个以上,则称该继承为多重继承。
2024-06-03 23:46:34
475
原创 C++在构造函数中使用new
●如果有多个构造函数,则必须以相同的方式使用new,要么都带[],要么都不带。在一个构造函数中将指针初始化为空指针(0,NULL,nullptr)也是可以的,这是因为delete(无论带不带[])可以用于空指针。●应该定义一个拷贝构造函数,通过深拷贝将一个对象初始化成另一个对象。通常,这种构造函数与下面的类型。如果对象中出现指针成员变量,那么必须实现构造函数,析构函数,拷贝构造函数和=重载函数,以达到深拷贝.拷贝构造函数应分配足够的空间来存储需要复制的数据,并复制数据,另外,还要更新其它成员。
2024-06-02 23:22:42
562
原创 C++自定义String类
s1,s2,s3,s3,s5都是局部变量,当main函数结束时生命周期自动结束,分别调用自己的析构函数。由于局部变量在栈中,栈的特点是后进先出,所以析构的顺序是s5,s4,s3,s2,s1。第3种情况,可能调用拷贝构造函数直接创建s4,也可能使用拷贝构造函数生成一个临时对象,然后再赋值给s4,这取决于编译器的具体实现,但我们使用的编译器都是直接调用拷贝构造函数直接创建s4;ps4是通过new创建的,在程序结束前必须调用delete释放,delete ps4时会调用ps4的析构函数。
2024-06-02 23:13:11
327
原创 C++一个StringBad类
上面的代码在构造s2时已经出错(s3也有问题),构造s2时并没有调用构造函数,后面在析构s2时程序直接崩溃。使用默认拷贝构造函数和使用默认=赋值运算符,导致浅拷贝,在析构时会出现重复释放(delete)同一段内存,导致程序崩溃。●拷贝(复制)构造函数。用对象初始化另一个新建对象,逐个复制非静态成员,复制的是成员的值(浅复制)。用对象赋值给另一个对象,逐个复制非静态成员,复制的是成员的值(浅复制)。设计一个字符串类,下面的代码是一个不好的设计,起名StringBad。●默认析构函数,不执行任何操作。
2024-06-02 23:04:37
473
原创 C++ 类型转换
本主题讨论C++如何处理用户自定义类型的转换。在讨论前,我们先复习一下C++如何处理内置类型转换的。1.如果这两种类型兼容,则自动将值转换为接收变量的类型。例如2.类型不兼容,不能自动转换,但可以强制转换。例如。
2024-05-30 23:58:43
1220
原创 C++运算符重载函数作为成员函数还是非成员函数
注意:非成员函数的重载运算符所需要的形参数目与运算符使用的操作数数目相同;而成员函数所需的参数数目少一个,因为其中的一个操作数是被隐式传递对象本身(this)。对于"<<"和">>"的重载必须是非成员函数,因为它的第一个参数是cout或者cin,不是自定义类对象。第一个操作数不是类对象的不能使用成员函数,例如cout<<类对象;重载运算符作为成员函数必须要求运算表达式第一个参数是类对象,因为必须通过类的对象去调用该类的成员函数。总结:能写成成员函数就使用成员函数,不能写成成员函数才使用非成员函数(友元)
2024-05-30 23:50:25
284
原创 C++常用的友元重载
<运算符要求左边是一个ostream对象,显然,cout是ostream对象,所以表达式cout<<x满足要求,但(cout<<x)目前的返回值是void,那么在 << y左侧的不再是ostream的对象cout ,所以出现错误。<<是可以并且多次被重载的运算符,最初<<是C和C++的位运算符,ostream类对该运算符进行了重载,对于每种基本类型,ostream类声明中都包含了相应的重载的operator<<定义。例如:重载运算符“<<”和“>>”的示例。在ctime.h中进行类型定义,代码如下。
2024-05-29 16:06:17
446
原创 C++利用友元进行重载
如果要为类重载运算符,可以定义第一操作数为类对象的成员函数,再添加一个第一操作数为非类对象的友元函数,然后友元函数内部,反转操作数的顺序(必须符合交换律)去调用类成员函数。由于于类的成员运算符重载函数的第一个操作数一定是类的对象, 有的情况运算符必须写成非成员函数.这个函数如果需要获得类对象的私有数据,则有如下方法。对于类的私有部分,只能通过公有的方法访问,但有时这种限制太严格,不适合特定的编程问题。实际上,还有更好的办法,利用乘法交换律,可以把上面的友元函数改为非友元(比方法1更简单)。
2024-05-29 15:56:09
194
原创 C++运算符重载
运算符重载是一种形式的C++多态,它使得对象操作更直观,本质上也是属于函数重载。实际上,我们已经在不知不觉之中使用了运算符重载。例如,加法运算符“+”可以对整数相加、也可以对string对象相加,如5+8;s1+s2;这是因为C++已经对string类重载了“+”运算符。又例如,C++对“<<”和“>>”进行了重载,用户在不同的场景下使用它们,作用是不同的。对于位运算而言,“<<”运算符是左移运算符,“>>”运算符是右移运算符。
2024-05-28 17:00:05
1675
原创 C++类与对象的特性
常量成员函数不能改变类的数据成员的值,也不能调用该类中非常量成员函数,只能调用该类的常量成员函数。静态成员函数不属于类的特定对象,其可以在不生成类的对象的情况下,直接访问类的静态成员变量,而不能访问类的非静态成员变量。当一个类声明为另一个类的友元时,这个类中的所有成员函数不仅可以访问自己所在类的所有成员,而且还可以访问friend语句所在类的所有成员。当一个类的成员函数声明为另一个类的友元函数后,它不仅可以访问自己所在类的所有成员,而且还可以访问friend语句所在类中所有成员。常量引用的对象不能被修改。
2024-05-28 16:51:45
317
原创 C++对象的生存期
对象生存期也称对象生命周期,是指对象从被创建到被释放的时间。按生存期的不同,对象可分为局部对象、静态对象、全局对象和动态对象4种。1.局部对象局部对象是指定义在一个程序块或函数体内的对象,包括形参。当定义对象时,系统自动调用构造函数,该对象被创建,对象的生存期开始。当退出该函数体或程序块时,调用析构函数,释放该对象,对象的生存期结束。#include <iostream>using namespace std;class A //测试
2024-05-18 23:58:24
774
原创 C++常量类型
在C++中,常量的定义使用const。由于常量的值在程序运行过程中不能被改变,因此,定义或说明常量时必须对其进行初始化。常量包含内置类型常量、对象类型常量(常量对象)、引用类型常量(常量引用)、常量对象成员(包括常量成员函数和常量数据成员)和指针常量(常量指针)等。本节介绍常量对象、常量引用、常量成员。
2024-05-14 14:28:36
415
原创 C++友元函数和友元类
类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,而其他函数是无法访问类的私有成员的。但有时这种限制太严格,不适合特定的编程问题。C++提供另一种访问途径-友元。友元有3种:●友元函数●友元成员函数●友元类对于一个类而言,它的友元虽然不是该类的成员函数,但是可以访问该类的私有成员。
2024-05-14 14:19:09
698
原创 C++类的静态成员
static 类型名 静态成员变量名;例如:定义一个学生类Student,其中包含学生姓名、学号、成绩,以及学生总人数。private://姓名int m_id;//学号//分数//学生总数。静态成员变量public://构造函数//输出函数。
2024-05-13 23:31:48
668
原创 计算机网络编程必备知识--一篇就够啦
广域网或者说互联网通常使用众多分级的路由器来连接分散的主机或者局域网,因此,通信的两台主机一般不是直接相连的,而是通过多个中间结点(路由器)连接的。TCP/IP 协议体系结构中,数据链路层的功能描述为实现网卡接口的网络驱动程序,以处理数据在物理媒介上的传输,不同的物理网络具有不同的电气特性,网络驱动程序隐藏了这些细节,为上层协议提供了一个统一的接口。因此,这一层的主要功能是在物理层提供的比特流的基础上,通过差错控制,使有差错的物理线路变为无差错的数据链路,即提供可靠的通过物理介质传输数据的方法。
2024-05-13 23:17:12
1616
原创 C++类与对象的一些练习
2.一矩形体育场如下图所示,现在需在其周围建一矩形过道,并在四周围安上栅栏。栅栏价格为50元/米,过道造价为240元/m^2。过道宽为3米,体育场的长宽由键盘输入。请编写程序计算并输出过道和栅栏的造价。1.设计一个名为Rectangle的矩形类,其属性为矩形的长和宽,能计算和输出矩形的周长和面积。3.设计一个复数类,要求对其构造函数进行重载。
2024-05-12 22:04:10
286
原创 C++组合类
1.第50行,定义对象stu1,需要调用Student的构造函数,但由于它包含Date类成员,所以在调用Student的构造函数前先调用Date的构造函数,然后再调用Student本身的构造函数。(2)在创建一个组合类的对象时,不仅它自身的构造函数将被调用,且其成员对象的构造函数也将被调用。(1)类的构造函数,不仅要考虑对本类数据成员的初始化工作,而且也要考虑成员对象的初始化工作。(3)若调用缺省构造函数(即无形参的),则成员对象的初始化也将调用相应的缺省构造函数。例如:组合类成员对象构造的顺序。
2024-05-12 21:59:58
454
原创 C++对象的赋值
(1)对象的赋值只对其中的数据成员赋值,不对成员函数赋值。每个对象的数据成员占用独立的存储空间,不同对象的数据成员占有不同的存储空间,赋值的过程是将一个对象的数据成员在存储空间的值复制给另一个对象的数据成员的存储空间。同类的对象之间可以互相赋值,即一个对象的值可以赋值给另一个对象。默认就是把一个对象所有非static数据成员的值依次赋值给另一个对象。(2)类的数据成员中不能包括动态分配的数据,否则在赋值时可能出现意想不到的严重后果(这个问题在后面的运算符重载讲解)。●析构函数 (如果没有,会出现内存泄漏)
2024-05-10 22:58:45
623
原创 C++对象的拷贝构造函数
5.第39行,c=a.add(b),首先实参b传递给非引用形参c会调用拷贝构造函数,接着在add函数中定义了一个复数类对象y(24行),系统会调用构造函数。如果类没有实现拷贝构造函数,它自动生成一个默认的拷贝构造函数,默认的完成分内的事情(1.为每个成员变量分配内存,2.每个成员变量赋值)如果一个构造函数的第一个参数是类本身的引用,且没有其它参数(或者其它的参数都有默认值),则该构造函数为拷贝构造函数。4.第38行,f(b),将实参b传给形参n,因为形参是非引用的类对象,调用拷贝构造函数。
2024-05-10 22:56:28
543
原创 C++向函数传递对象的三种传递方式比较
指针虽然功能强大,但是用起来比较困难,所以如果的确只需要借用一下某个对象的“别名”,建议使用“引用”,而不要用“指针”。(2)引用是C++中的重要概念,引用的主要功能是传递函数的参数和返回值。学完这3种传递方式后大家会发现“引用传递”的性质像“指针传递”,而书写方式像“值传递”。说明:从代码效率上看,用对象值传递的方式的效率相对低一些,它需要创建新的对象来接收实参传来的值,用指针或者引用效率更高。(1)值传递是单向的,形参的改变并不会引起实参的改变。而指针和引用传递是双向的,可以将改变由形参“传给”实参。
2024-05-09 22:03:59
170
原创 C++对象引用作为函数参数
它不但有指针作为参数的优点,而且比指针作为参数更简单、更方便。引用方式进行参数传递,形参对象就是实参对象的“别名”,对形参的操作其实就是对实参的操作。例如:用对象引用进行参数传递。
2024-05-09 22:02:15
328
原创 C++对象指针作为函数参数
对象指针作为参数传递的是实参对象的地址。即实参对象指针和形参对象指针指向同一内存地址,因此若形参对象所指向成员数据的改变是可以影响实参数据成员的。例如:修改上面的代码,验证对象指针作为函数参数可以修改实参的值。
2024-05-08 23:39:29
238
原创 C++this指针
this 指针是一个隐含于每一个成员函数中的特殊指针。它是指向一个正操作该成员函数的对象。当对一个对象调用成员函数时,编译程序先将对象的地址赋予this指针,然后调用成员函数。每次成员函数存取数据成员时,C++编译器将根据 this 指针所指向的对象来确定应该引用哪一个对象的数据成员。每个成员函数(包括构造函数和析构函数)都有一个this指针。它指向调用对象,如果成员方法需要使用该调用对象,则可以使用this或者*this。通常this指针在系统中是隐含存在的,也可以把它显式表示出来。
2024-05-07 23:41:18
145
原创 C++ 对象数组
定义对象数组、使用对象数组的方法与基本数据类型相似,因为类本质上也是一种数据类型。在定义对象数组时,系统不仅为对象数组分配适合的内存空间,以存放数组中的每个对象,而且还会为每个对象自动调用匹配的构造函数完成数组内每个对象的初始化工作,但数组结束时会自动调用每个对象的析构函数。局部变量(栈中)的数组,构造是从0下标开始往后进行,而析构是从后往前进。例如:对象数组使用。
2024-05-06 23:00:01
204
原创 C++构造函数和析构函数的调用顺序
一般情况下,调用析构函数的次序正好与调用构造函数的次序相反,也就是最先被调用的构造函数,其对应的析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被调用。当然对象的构造函数和析构函数调用时机和它的生命周期是密不可分的。下面归纳一下什么时候调用构造函数和析构函数。(1)全局对象(生命周期:程序运行时创建,程序结束时销毁)的构造函数在所有函数(包括main函数)执行之前调用。但如果一个程序中有多个文件,而不同的文件中都定义了全局对象,则这些对象的构造函数的执行顺序是不确定的。
2024-05-06 22:54:41
2505
原创 C++析构函数
当对象的生存期结束时,系统就会自动执行析构函数清除其数据成员所分配的内存空间。(5)如果没有定义析构函数,系统会自动生成一个默认的析构函数,这个析构函数不做任何事情。总结:系统在对象销毁(生存期结束)时,自动调用析构函数。(3)一个类有且仅有一个析构函数,必须为public。(4)在对象的生存期结束时,由系统自动调用析构函数。(2)析构函数没有参数、没有返回值,不能重载。(1)析构函数名是由“~”加类名组成的。
2024-05-05 23:53:10
234
原创 C++构造函数与初始化列表
构造函数也可以采用构造初始化列表的方式对数据成员进行初始化。利用构造函数定义(声明)对象的其它方式。例如,可以把上面的构造函数的定义。
2024-05-05 23:51:34
203
原创 C++类定义时成员变量初始化
(3).第28行,A c{ 1000,2000 };调用第6行构造函数,m_a是传入的实参1000,m_b是传入的实参2000。(2).第24行,A b{ 100 };调用第4行构造函数,m_a是第10行的初始值10,m_b是传入的实参100。(1).第20行,A a;调用第4行的构造函数,m_a是第10行的初始值10,m_b是b的默认参数0。如果在构造函数中也有赋值,以赋值的为准,这个就和普通变量一样,初始化的值会被后面的赋值覆盖。在C++11中允许在类定义时对成员变量初始化。
2024-05-04 23:51:34
224
原创 C++构造函数的重载
一个类可以定义多个构造函数,以便为类的对象提供不同的初始化方法,供用户选择使用。这些构造函数具有相同的名字,但参数列表不同。例如:构造函数重载。
2024-05-04 23:49:51
246
原创 C++默认构造函数
class Point //点类private:int x;//x坐标int y;//y坐标public:Point() //默认构造函数,也是无参构造函数cout << "自定义默认构造函数" << endl;x = 0;//自己定义的就可以对成员变量进行初始化y = 0;void show()//输出函数int main()Point p2;p2.show();return 0;
2024-05-03 23:34:54
352
原创 C++类成员函数重载
成员函数重载是指在同一个类里,有两个以上的函数具有相同的函数名。每种实现对应着一个函数体,但是形参的个数或者类型不同。创建一个类,在类中定义3个名为subtract的重载成员函数,分别实现两个整数相减、两个实数相减和两个复数相减的功能。
2024-05-02 23:41:32
280
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人