C++ primer plus notebook

C++ primer plus notebook,第1张

P505
重载的箭头访问运算符必须是成员函数,且返回值必须是指针或者某个定义了箭头访问运算符的类的对象。
P509
lambda表达式产生的类不含赋值运算符,是否含有拷贝/移动构造函数则通常要视捕获的数据成员类型而定。

P514
转换构造函数和类型转换运算符共同定义了类类型转换(class-type conversions),也叫做用户定义的类型转换(user-defined conversions);
类型转换函数必须是类的成员函数,不能声明返回类型,形参列表必须为空,通常是 const。

class c1
{
public:
	int a;

	explicit operator int()const//不能隐式转换
	{
		cout << "hello" << endl;
		return a;
	}
	explicit operator bool()const//被用作条件时,可以隐式转换
	{
		return a;
	}	
};

operator bool()一般定义为explicit,其被当作条件时,可以隐式转换,其它的所有类型转换符如果是explicit,则只能显式转换。

P520 重载函数与用户定义的类型转换

struct A
{
	A(int) {}
};
struct B
{
	B(double){}
};
void f1(const A&) {}
void f1(const B&){}
//在调用重载函数时,如果需要额外的标准类型转换,则该转换的级别只有当所有可行函数都请求同一个用户定义的类型转换时才有用。
f1(2);//具有二义性,f1(A(2))或者f1(B(double(2));

P521

class c1
{
public:
	
	c1 operator+(const c1&)
	{
		cout << "mem funciton" << endl;
		return *this;
	}
	friend c1 operator+(const c1&, const c1&)
	{
		cout << "friend function" << endl;
		return c1();
	}	
};
c1 a,b;
a+b;//调用的是成员函数版本的重载运算符;因为友元函数形参是两个const c1&,而成员函数是一个const c1&和一个隐式的this,显然成员函数版本更匹配。如果把成员函数改成const,则会出现二义性!

P 539
虚函数与默认实参
如果我们通过基类的引用或指针调用函数,则使用基类中定义的默认实参,即使实际运行的是派生类中的函数版本也是如此。因此,如果虚函数使用默认实参,则基类和派生类中定义的默认实参最好一致。

P541 纯虚函数
可以为纯虚函数提供定义,不过函数体必须定义在类的外部。也就是说我们不能在类的内部为一个=0的函数提供函数体。
P 543
对于基类中的protected成员,派生类的成员函数和友元函数只能访问派生类对象中的基类部分的protected成员;对于普通的基类对象中的成员不具有特殊的访问权限。

class parent
{
private:
	int a;
protected:
	int b = a;
};

class child :public parent
{
public:
	void f1(child a)
	{
		cout << a.b;//可以访问b
	}
	void f1(parent a)
	{
		cout<<a.b;//不能访问b;
	}
};

P 544 派生类向基类转换的可访问性
对于代码中的某个派生类向基类转换的代码,如果在该代码处能够访问基类的公有成员,则能够转换,否则不能转换!(转换实际是调用了public的赋值 *** 作符函数或构造函数)
P 545
友元与继承
每个类负责控制各自成员的访问权限,包括嵌套在派生类对象中的成员的访问权限。不能继承友元关系。
P455 改变继承的成员的可访问性

class c1
{
protected:
	int a = 0;
};
class c2:public c1
{
public:
	using c1::a;//使用using使得本来在c2中是protected的a变成public
	
};
int main(int argc,char*argv[])
{
	c2 a;
	cout << a.a;
	return 0;
}

P551 覆盖重载的函数
覆盖指的是函数返回值和形参完全一样,对于基类的多个重载的函数,如果派生类中覆盖了其中一个,则派生类的函数会隐藏对应的基类的函数名,要想在派生类中实现重载,可以把基类的所有重载函数都覆盖一遍,或者使用using 声明,然后只覆盖需要重写的函数,使用using 声明应该确保基类的重载函数在派生类中都是可以访问的。对派生类没有重新定义的重载版本的访问实际上是对using声明点的访问。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1499051.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-25
下一篇2022-06-25

发表评论

登录后才能评论

评论列表(0条)

    保存