目录
用delete销毁某动态分配的对象时,也会在delete内调用该对象的析构函数;
(同理,在new出一个指向某对象的指针的时候,也会调用构造函数)
若该类中有new出来的空间,那么该类的析构函数中要写delete
最小的类
即对于每个类,默认都有这四个缺省。
对于无参构造函数,一旦人为添加任何构造函数,那么该默认无参构造将不复存在。
一. 构造函数
没有返回值!!!!
①另一种用法:
(2)处答案为 real+b.real,imag+b.imag
直接调用构造函数可表示生成一个临时对象 就跟我们调用string(n,c)输出一个字串一样
如果把成员函数或构造函数的定义写在类外,默认值请写在声明的地方,定义的地方不要写默认值。默认值不能重复出现
来看看这个构造函数:
这里其实是把本来有的int数组s的地址赋给了FunArray的pa,所以pa和s指向同一块空间,即pa和s本就相等,所以本质上就是在同一个数组上修改
②构造函数的初始化顺序:
按照定义变量的顺序进行初始化,与参数表的顺序无关
③构造函数的隐含使用:
二.拷贝构造:
系统存在一个默认拷贝构造函数,是位对位的浅拷贝
拷贝构造范例:
//函数原型 A(const A &a ) 为什么一定要用引用?
//因为不引用的话就无限拷贝构造了!
若构造函数需要申请动态空间,那么拷贝构造无论怎么样都不要忘了申请动态空间啊!!!!!
三.赋值
四.析构函数
用delete销毁某动态分配的对象时,也会在delete内调用该对象的析构函数;
(同理,在new出一个指向某对象的指针的时候,也会调用构造函数)
若该类中有new出来的空间,那么该类的析构函数中要写delete
析构函数里面写需要额外做的事情
它也可以用作普通函数的调用:(*this).~xxx() 或者 this->~xxx()
五.顺序问题
六.this指针
注意看函数声明里面的return:是一个引用!
如果不带引用,返回的就是一个临时值,对原来的值不影响
七.const常量
通俗的讲,就是一个是指针a是常量;一个是通过指针a指向的对象(尽管对象本身并不受影响)是常量。
这里的const其实本质上是用来修饰隐含参数*this的
在声明和定义函数时都要有const关键字!
在重载运算符的时候也是一样的:
如果是在函数的首部加const,那就是表示返回的值不可再更改
所以说,如果要为常量对象写operator[]的话,要加const x2
首部如果不写const的话,就会报错捏:
八.Static(是有默认值0的)
静态成员变量的定义没有static!没有static!没有static!
九.友元
类模板里的友元函数
报错: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
其他类函数:
①注意返回的是引用还是只是一个临时值
此时的d1.incOne().incOne():在d1的基础上加两天,d1加了两次
如果把函数头部的&去掉,那就是返回一个Date临时值,这个Date临时值和*this(加了一次的d1值)相等,再对这个Date临时值.incOne(),那就是对这个临时值加了一次,返回的是加了两次的结果,但d1只加了一次
顺便,②*this的使用 :
③return空,函数直接结束
写在后面:一些程序阅读和填空题易出错的
①友元函数访问私有数据记得带对象!!
②c串的拷贝忘了吗:strcpy(str,s.str)
③实际问题合不合法注意是否要判断正负
④重载了<,最后要从大到小输出:默认sort再倒着输出就好了啊
防止冗余声明
通常在.h文件头加上:
#ifndef 大写类名
#define 大写类名
#endif