class类

目录

最小的类

一. 构造函数

①另一种用法:

②构造函数的初始化顺序:

 ③构造函数的隐含使用:​

二.拷贝构造:

拷贝构造范例:​

 三.赋值

 四.析构函数

用delete销毁某动态分配的对象时,也会在delete内调用该对象的析构函数;

(同理,在new出一个指向某对象的指针的时候,也会调用构造函数)

若该类中有new出来的空间,那么该类的析构函数中要写delete

五.顺序问题

 六.this指针

七.const常量

 八.Static(是有默认值0的)

 九.友元

类模板里的友元函数

 报错:undefined reference to

解决方法

其他类函数:

顺便,②*this的使用 :

 ③return空,函数直接结束

写在后面:一些程序阅读和填空题易出错的

防止冗余声明


最小的类

即对于每个类,默认都有这四个缺省。

对于无参构造函数,一旦人为添加任何构造函数,那么该默认无参构造将不复存在。

一. 构造函数

没有返回值!!!!

①另一种用法:

58a9e934678044389c2d922972048fe0.png

 (2)处答案为  real+b.real,imag+b.imag

直接调用构造函数可表示生成一个临时对象   就跟我们调用string(n,c)输出一个字串一样

43e1ac143f704590a94ab2b72708f7fd.jpeg

如果把成员函数或构造函数的定义写在类外,默认值请写在声明的地方,定义的地方不要写默认值。默认值不能重复出现

来看看这个构造函数:

631c0a697108462e8a1d5586cf271ffd.jpeg

 这里其实是把本来有的int数组s的地址赋给了FunArray的pa,所以pa和s指向同一块空间,即pa和s本就相等,所以本质上就是在同一个数组上修改

②构造函数的初始化顺序:

f51ee8815b9b4b329090da29f55fc9d7.png

按照定义变量的顺序进行初始化,与参数表的顺序无关 

3a00cfaea1854a289afbda24c1121453.png

 ③构造函数的隐含使用:

二.拷贝构造:

系统存在一个默认拷贝构造函数,是位对位的浅拷贝

8530162b1fce4413995d2af442b58117.png

拷贝构造范例:24b82ea8ee144852b1ebb6627bad1bce.png

 //函数原型 A(const A &a ) 为什么一定要用引用

//因为不引用的话就无限拷贝构造了!

若构造函数需要申请动态空间,那么拷贝构造无论怎么样都不要忘了申请动态空间啊!!!!!

 三.赋值

5f2940ce3cbf46378290da1a17817031.png

658a8b1a00ee4680a54580995166db2a.png

 四.析构函数

1fb6b46596964369bbc0f6f92baf0e51.png

14dac47afeff4cb4be2f95cb524bb057.png

b87ebbc485f14236a97d1feb58a72460.png

用delete销毁某动态分配的对象时,也会在delete内调用该对象的析构函数;

(同理,在new出一个指向某对象的指针的时候,也会调用构造函数)

若该中有new出来的空间,那么该类的析构函数中要写delete

析构函数里面写需要额外做的事情

它也可以用作普通函数的调用:(*this).~xxx()  或者   this->~xxx()  

五.顺序问题

3f26336dd7cc45418d90ef6abfe41967.png

4196e209d00d4ad79bc7551a12ee39d9.png

  六.this指针

a9b1feab8ea84ef59cd1b21720e6edad.png

 注意看函数声明里面的return:是一个引用!

dd5dad6b06b34e0a99562b3b72f672bd.png

 如果不带引用,返回的就是一个临时值,对原来的值不影响

七.const常量

fceb24ded7eb4e8188405ffa77e826e7.png

7caf8519beeb45dd90c1ff2c86330b04.png

e5e188e9e47d46789a7e91c9421035a3.png3a51441ed1354e77aa03249ffcf7eb68.png

 通俗的讲,就是一个是指针a是常量;一个是通过指针a指向的对象(尽管对象本身并不受影响)是常量。

43d2b7ea607b4610be4bc744d9bd349e.png

0eb39606bf6e4af491b7caf6a1263fe3.png

这里的const其实本质上是用来修饰隐含参数*this的

在声明和定义函数时都要有const关键字! 

ddf6debf77c3401f9ede215440861216.png

f84c3738c5c248d8bd17c881de3cc87d.png

在重载运算符的时候也是一样的:

0ab0b141ca96496ba81d86452efe92d4.jpeg

如果是在函数的首部加const,那就是表示返回的值不可再更改 

所以说,如果要为常量对象写operator[]的话,要加const x2

首部如果不写const的话,就会报错捏:

 八.Static(是有默认值0的)

1e34e19ee3f247e9b7eba02d10a83bfa.png

6d22fa67cc7547ba914b43be38a60392.png

 静态成员变量的定义没有static!没有static!没有static!

 934d0bae900f4a4b98e74ff6ad5406ed.png

0daae96988de4a65991775ad10831fdf.png

 6057bc00a0554e1481b056455a17feee.png

 ec1b5a3cb5f344eb9bfdf7a91fbe3b9a.png

 ea504588763940f4b2eb6f7c244fc581.png

 九.友元

ebbf0ba99c4a475fb6a4cdb2adc07815.png

 da425bbfcee6472d80a78534d715004c.png

c09f85111bb846bb9d914a08cf71e805.png

类模板里的友元函数

 报错:undefined reference to

当有如下代码时,将会报错

template <class T>
class A{
    T x,y;
public:
    A(T a,T b):x(a),y(b){}
    void SetX(const T& a);
    friend void f(const A<T>& a);
};

template<class T>
 void f(const A<T>& a){
    cout<<"success!\n";
}

这是因为声明友元的时候没有声明其为函数模板。 

解决方法

声明友元函数的时候,也需要声明其为函数模板。

#include <bits/stdc++.h>
using namespace std;
template <class T>
class A{
    T x,y;
public:
    A(T a,T b):x(a),y(b){}
   void SetX(const T& a);
    template<class S>//如果这里将S改成T,会出现重定义的报错
    friend void f(const A<S>& a);
};
template<class T>
 void f(const A<T>& a){
    cout<<"success!\n";
}

 具体可参照博客undefined reference to

其他类函数:

①注意返回的是引用还是只是一个临时值

280b617960424695805f227e247a98da.jpeg

此时的d1.incOne().incOne():在d1的基础上加两天,d1加了两次

如果把函数头部的&去掉,那就是返回一个Date临时值,这个Date临时值和*this(加了一次的d1值)相等,再对这个Date临时值.incOne(),那就是对这个临时值加了一次,返回的是加了两次的结果,但d1只加了一次

顺便,②*this的使用 :

73f2779aaf5c4904b6c61951a26522fc.jpeg

 ③return空,函数直接结束

cdcf9cd6688f4332b95895ac457a3fca.jpeg

写在后面:一些程序阅读和填空题易出错的

①友元函数访问私有数据记得带对象!!

②c串的拷贝忘了吗:strcpy(str,s.str)

③实际问题合不合法注意是否要判断正负

④重载了<,最后要从大到小输出:默认sort再倒着输出就好了啊

防止冗余声明

通常在.h文件头加上:

#ifndef 大写类名
#define 大写类名

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值