C++笔记
一,类和对象
1.复制构造函数
形如:x::x(x &a) or x::x(const x &a) (x :类名)
错误:x::x(x)
1.5 移动构造函数
形如:x::x(x &&a)noexcept or x::x(const x &&a) noexcept (x :类名)
2.构造函数
可以有参数,不能有返回值,用来初始化对象。
3.析构函数
1.没有参数和返回值,一个类只能有一个析构函数。
2.形如 “~类名( ){};”
3.对象数组的每个元素的析构函数都会被调用。
4.delete运算 会导致析构函数调用。
4.静态成员
1.关键字:static
2.静态成员变量本质上是全局变量。
3.在静态成员函数中,不能访问非静态成员变量 ,也不能调用非静态成员函数。
4.静态成员变量是为酥所有对象共享的 一共就一份。
例如:
class xbai{
int n;
static int s;
};
sizeof(xbai)=4;
//sizeof 运算符不会计算静态成员变量。
4.1 访问静态成员
1.类名::成员名
xbai::print();
2.对象名.成员名
xbai r; r.print();
3.指针->成员名
xbai *p=&r; p->print();
4.引用.成员名
xbai &re=r;int n=re.ntotalnumber;
5.成员对象与封闭类
概念:成员对象:一个类的成员变量是另一个类的对象。
封闭类:包含成员对象的类。
封闭类构造函数的初始化表
1.类名::构造函数(参数表):成员变量1(参数表),成员变量2(参数表){ ... }
2.先执行成员对象的构造函数,在执行封闭类自身的构造函数。析构函数相反(**先构造的,后析构**)
6.友元
friend int x;fried void fund();
friend class**
6.1 友元函数
一个类的友元函数可以访问该类的 私有成员。
6.2友元类
A是B的友元类 -> A的成员函数可以访问B的私有成员。
Note:友元类之间的关系,不能传递,不能继承。
7.this指针
非静态成员函数中可以直接使用this来代表指向该函数作用的对象的指针。
class complex{
public:
double real,imag;
void printJ(){cout<<real<<" "<<imag;}
complex (double r,double i):real(r),imag(i)
{
cout<<"小柏最帅"<<endl;
}
complex addone(){
this->real++ ;//等价于real+m+;
this->print();//等价于print();
return *this;
}
};
1.可以用来返回当前对象的引用
s& xx(int x){
this->aa=x;
return *this;
}
8.常量对象,常量成员函数,常引用
8.1 常量对象
如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加上const关键字。
class demo{...};
const demo obj;//常量对象
8.2 常量成员函数
在类的成员函数说明后面可以加const关键字,则该成员函数为 常量成员函数。
常量成员函数执行期间不应该修改其所作用的对象。
因此,在常量成员函数中不能修改成员变量的值(静态成员变量除外),也不能调用同类的非常量成员函数(静态成员变量除外)。
class sample
{
public:
int value;
void getv() const;
void func(){};
};
void sample::getv() const
{
value=0;//wrong
func();//wrong
}
int main()
{
const sample o;
o.value=100;//error 常量对象不可被更改
o.func();//error 常量对象上不可以执行非常量成员函数
o.getv();//ok 常量对象上可以执行常量成员函数
return 0;
}
8.3 常引用
const int &r=n;
r=5;//error
n=4;//ok
9.运算符重载
9.1基本概念
略
x=y+z 等价于 x=y.operator+(z)。
9.2 赋值运算符‘=’的重载
10 常量函数
只有类的成员函数才能定义为常量函数,普通函数则不能定义常量函数。
class{
public:
double f()const;//正确
};
int fx()const;//错误
继承
基类的成员隐藏,(只是隐藏起来,不代表没有继承)
先调用的是派生类的构造函数,然后是基类的构造函数
基类没有缺省构造函数,派生类必须要在初始化列表中显式给出基类名和参数列表。
基类没有定义构造函数,则派生类也可以不用定义,全部使用缺省构造函数。
基类定义了带有形参表构造函数,派生类就一定定义构造函数。