赞
踩
对象和对象之间的关系:分别使用不同的内存来存储数据,使用相同的内存上的函数(一份函数拷贝)
1.基本概念
类的声明和设计是最基础最重要的部分,合理的类声明可以让后面的工作很方便,也是面向对象思想的体现。
首先通过上面的结构图已经知道类的基本结构,首先就是数据,数据有公有和私有之分,这是权限。根据实际中的要求来决定数据的共有和私有属性。
然后就是函数。函数和数据其实是一样的。也有共有和私有之分。根据实际情况来确定是公有和私有。
2.构造函数
函数中有一个特殊的函数,那就是构造函数。因为一个类中大部分数据是隐藏的,总不能老是通过调用公共函数的方法来进行初始化。C++提供的就是构造函数的方法。
构造函数的建立规则是这样的。构造函数没有返回值,构造函数的名字和类的名字完全一模一样(大小写也相同),所有看到一个类声明中没有返回值,那么说明这个函数是构造函数,构造函数必须放在public下面。构造函数可以有很多种选择,这时候就需要用到函数重载的方法来定义了。
一般的构造函数声明为:
默认构造函数:Student();
带有参数的构造函数:Student(参数列表);
注意:
在完全没有自已定义构造函数的时候,系统会提供一个默认构造函数,类似于Student(){}
这个样子,仅仅创建一个对象但是不做任何初始化。也就是说,此时的一些数据成员都是没有被初始化的。
要是自己提供了构造函数,就必须自己同时为系统提供一个默认构造函数。
自己定义默认构造函数的方式有两种:定义一个没有参数的构造函数。给已有的构造函数的全部参数提供默认值。本质上,这两个构造函数使用的时候都不用加上任何参数。所以才能够做默认构造函数。
3.析构函数
构造函数起到了构造对象的作用,那么怎么销毁不需要用的对象呢。那就是析构函数。必须有一个析构函数若程序员没有提供析构函数,系统将自动提供一个默认的析构函数
析构函数定义方式:
1.原型:~Student() (固定,必须是这个样子!)
2.实现Student::~Student()
{
。。。
}
析构函数的调用时间(通常不在代码中显式的调用析构函数。)
静态存储类对象:程序结束后自动被调用
动态存储类对象:程序执行完定义这个对象的代码块之后自动调用
通过new创建:将驻留在栈内存或者自由存储区中,当使用delete来释放内存的时候,析构函数自动被调用
4.类声明式样
类规划好之后就是其中的函数的实现,函数的实现还是根据功能来看的。所以,这里是很自由灵活的。其中有一个是限定符的概念。很简单的啦。
直接上模板
这里要知道,每次创建新的对象之前必然要调用构造函数。所以要非常熟悉怎么利用构造函数创建处对象的几种方法。
1.自定义的构造函数创建对象(C++11的几种初始化方式统一起来了)
2.自定义的默认构造函数创建对象
其中对象指针有些难度,在下面的动态内存管理中会专门介绍对象指针.
实践证明,类私有成员可以被类成员函数访问,不区分成员在哪个对象里。
有时候,我们创建了一个对象,但是事实上,我们只希望这个对象初始化之后不被改变,它可以是一个真理或者是什么,就是不能被改变。
然后我们就十分自然的想到const创建一个对象。以下面的代码为例,但是后面发现就算是调用对象中不会改变值的showInfo()
函数的时候,也会报错。
解决办法就是告诉编译器,这个函数会承诺不会改变任何的值,怎么承诺呢?就是在相应的函数定义和声明的后面直接加上const。就行了。
一定要强制养成在不改变类中的值得函数后加const的习惯!!使之成为const成员函数
定义:this指针指向用来调用成员函数的对象。 This本质就是指向本对象的一个指针。
This指向调用对象。
要引用整个对象,可以用
*this
当创建多个对象的时候,一个名字一个名字来写的话会很累。比如一个班上所有的人数。所以,这个时候用数组是一个很方便的选择。
创建格式:
1.创建且调用默认构造函数。
Student stu[100];
没错,就是这么简单(当然在底层,这些都是直接调用的默认的构造函数。)
2.创建调用自己写的构造函数初始化。
Student stu[100] =
{
Student(参数列表。。), //自定义构造函数初始化
Student(),//默认构造函数初始化
......
....
}
没错,这里可以使用不同的构造函数(如果你定义了很多的话)来分别构造每个对象的属性。后面其他的如果没有列出来视为直接调用默认构造函数。
对象数组初始化的方案是:系统首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后将临时对象中的内容复制到相应的元素中去.
1.在类中定义的名称(如数据成员名和类成员函数名)的作用域都为整个类,且在本类中是已知的,在其他的类中是未知的。(在不同的类中使用相同的名字而不会引起冲突)
2.在外部不能够直接访问类中的成员,公有成员函数也是如此,要调用共有成员函数,必须通过对象。
3.在类声明或者函数定义中,可以使用没有修饰的成员名称(未限定的名称)。
例子:一个学生类的例子
student.h
student.cpp
run.cpp
结果:
一个time类的add函数,重载为+运算符。
原函数是这个样子
怎么把add函数重载为一个运算符呢?
那很简单!!!!!!其他的的任何东西都不动,把想要重载的方法名改变为operator 相应的操作符。例如,想重载 +这个元算符。那么函数名就改为operator +。
上面的函数变为
函数声明中
函数定义中
那怎么去用已经重载好的运算符呢?
它会自动识别他的操作数,所以只要是满足意义或者定义的操作数的组合都能够得到有意义的答案
一定要注意,前面的那个操作数是主调对象,后面的那个是参数。也就是说,有的时候他们之间的结合不一定是能够交换的!!!!
重点:重载限制
我们已经知道,大多数的运算符能够使用成员函数和非成员函数来进行重载。一般来说,
非成员函数为友元函数(因为要访问类中的私有数据)。
以前面的重载加法运算符来说,可以写成两种方式
Time operator +(const Time &t)const;
Friend Time operator +(const Time &t1,const Time &t2);
加法运算符需要两个操作数(因为前面已经说过,重载不能也不会改变原有运算符的操作数的多少)。
对于第一个版本,也就是前面的成员函数的版本,一个操作数通过this指针隐式的传递,另外一个通过参数显示的传递。
对于第二个非成员函数的版本,两个操作数都是作为参数来传递。
总结:
非成员函数的重载运算符函数所需要的形参数目与运算符所使用的操作数是相同的。
成员函数的重载运算函数所需要的形参数目比要用的操所数目少一个,因为其中的一个参数是被隐式的传递给调用对象。
在定义元算符的时候,只能选择其中的一种,不然编译器会分不出出现报错!!!
重载<<运算符输出对象的一个例子
默认构造函数,如果没有定义构造函数
默认析构函数,如果没有定义(前面已经讲到过)
复制构造函数,如果没有定义(重点注意)
赋值运算符,如果没有定义(重点注意)
地址运算符,如果没有定义
这个就是前面讲过的默认构造函数,应该很熟悉了.
它有如下特点:
1.没有构造函数的时候,系统自动提供一个构造函数,且这个构造函数什么也不做.
2.要是定义了自己的构造函数,则必须同时定义一个默认构造函数.
3.自己定义的默认构造函数可以是不带任何参数的函数,也可以全部带有默认值的函数.系统把这两种类型的构造函数都当做是自定义的默认构造函数
4.不能够同时出现两个或以上的默认构造函数,因为系统会无法分辨
概念
1.用于讲一个对象复制到新创建的对象中.
2.本质就是用于初始化过程(不是常规赋值)和按值传递参数
3.复制构造函数原型:Class_name(const class_name &);
(相当于传入一个相同类的对象引用的构造函数。)
何时调用复制构造函数
1.新建一个对象并且将其初始化为同类现有对象时(初始化过程)
设Student为类.stu1是已经存在的对象,stu2是新创建的对象
Student stu2(stu1);
Student stu2=stu1;
//这是在初始化的阶段,和赋值是不一样的
Student stu2=Student(stu1);
Student *p_stu2=new Student(stu1);
(这几种形式都将调用复制构造函数.)
上面几种形式说明了,对于这些形式是不调用构造函数就能够创建新的对象的.非常重要记住2.函数按值传递对象或者函数返回对象时
由于按值传递对象将调用复制构造函数,因此可以按照引用传递对象。这样可以节省调用构造函数的时间以及存储新对象的空间。
默认的复制构造函数的功能
默认的复制构造函数逐个复制非静态成员(成员复制也叫做浅复制),复制的是成员的值。
成员是常数或者是一些基本量,是可以直接赋值过去的.
成员是结构体得话,因为在C++中结构体可以直接交换,所以也是能够赋值过去的.
成员是类的话,也是可以直接赋值过去的.
静态函数或常量不受影响,因为他们是属于整个类,而不是各个对象。重点:
要是指针或者C风格的字符串.那么依然还是能够赋值,但是赋的是指针的值.所以,这里很容易有隐患,需要更加深层次的复制的时候就要关心这里.
如果成员本身就是类对象,则将使用这个类的复制构造函数来复制成员对象。因为类中包含了使用new初始化的指针成员,那么定义一个复制构造函数是很必须的,用来复制指向的数据,而不是一个指针.(浅复制只会复制指针的值,而不会深挖指针指向的结构,所以必须自己定义一个深复制.)
自定义复制构造函数方式:
StringBad::StringBad(const StringBad & st)
{
Xxx
Xxx
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。