C++类与对象基本语法(2)

版权声明:本文为博主原创文章,遵循GPL开源协议精神,转载请注明出处。 https://blog.csdn.net/Robot__Man/article/details/82889546

7、常函数与常对象

(1)如果在一个类的成员函数的参数表后面加上const关键字,那么这个成员函数就被称为常函数,常函数的this指针是一个常指针。在常函数内部无法修改成员变量,除非该变量具有
mutable属性。而且在常函数内部也无法调用非常函数。
(2)常对象:拥有const属性的对象、对象引用或指针。
常对象只能调用常函数。
同型的常函数和非常函数可以构成重载关系。常对象调用常版本,非常对象调用非常版本。如果没有非常版本,非常对象也可以调用常版本。

const XXX 函数名(const YYY yyy) const{
	...
}	
//第三个const修饰this指针,所以全局函数不能是常函数。

8、拷贝构造函数和拷贝赋值运算符

(1)拷贝构造函数
用一个已有的对象,构造和它同类型的副本对象——克隆。
(2)形如

class X{
	X(const X& that){ ... }
};

的构造函数称为拷贝构造函数。如果一个类没有定义拷贝构造函数,系统会提供一个缺省拷贝构造函数。缺省拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型的成员变量,调用相应类型的拷贝构造函数。
(3)在某些情况下,缺省拷贝构造函数只能实现浅拷贝,如果需要获得深拷贝的复制效果,就需要自己定义拷贝构造函数。
(4)形如

class X{
	X& operator=(const X& that){
		...
	}
};

的成员函数称为拷贝赋值运算符函数。如果一个类没有定义赋值运算符函数,系统会提供一个缺省拷贝赋值运算符函数。缺省拷贝赋值运算符函数对于基本类型的成员变量,按字节复制,对于类类型的成员变量,调用相应类型的拷贝赋值运算符函数。
(5)在某些情况下,缺省拷贝赋值运算符函数只能实现浅拷贝,如果需要获得深拷贝的复制效果,就需要自己定义拷贝赋值运算符函数。

练习:
(1)用字符指针形式的字符串构造。
(2)拷贝构造和拷贝赋值。
(3)获取字符指针形式字符串的成员函数,类似string::c_str。
说明:不得使用std::string!


9、静态成员

(1)静态成员变量和静态成员函数是属于类的而非属于对象。
(2)静态成员变量,为多个对象所共享,只有一份实例,可以通过对象访问也可以通过类访问,必须在类的外部定义并初始化。
(3)静态成员变量本质上与全局变量并没有区别,只是多了类作用域的约束,和访控属性的限制。

class Account{
private:
	string m_name;
	double m_balance;
	static double m_rate;
};

(4)静态成员函数,没有this指针,无法访问非静态成员。
(5)单例模式
饿汉模式和懒汉模式


10、成员指针

10.1、成员变量指针
Student s;
string* p = &s.m_name;//不是
Student s2;

(1)定义
成员变量类型 类名::*指针变量名;

string Student::*pname;
int Student::*page;

(2)初始化/赋值
指针变量名 = &类名::成员变量名

pname = &Student::m_name;
page = &Student::m_age;

(3)解引用
对象.*指针变量名
对象指针->*指针变量名

Student s, *p = &s;
s.*pname = “张飞”;
cout << p->*page << endl;
10.2、成员函数指针

(1)定义
成员函数返回类型 (类名::*指针变量名)(参数表)

void (Student::*plearn)(const string&) const;

(2)初始化/赋值
指针变量名 = &类名::成员函数名;

plearn = &Student::learn;

(3)解引用
(对象.*指针变量名)(实参表);
(对象指针->*指针变量名)(实参表);

(s.*plearn) ("C++");
(s->*plearn)("UNIX");

猜你喜欢

转载自blog.csdn.net/Robot__Man/article/details/82889546
今日推荐