const成员函数及其权限

本文详细解析了C++中const关键字的不同应用场景,包括指针与成员函数的使用方式。阐述了const对象如何调用成员函数的规则,并解释了权限变化原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

const成员函数:在成员函数后加const,const修饰this指针指向的对象,这也就保证调用这个const成员函数的对象在内部不会被改变

    

首先我们要搞懂const放在不同的位置,它修饰的是谁

int main()
{
	char* a = "hello";
	char* b = "bit";
	const char* p1 = a;
	char const *p2 = a;
	char* const p3 = a;

	p1 = b;           //const修饰的是*p1,所以p1可以改变
	//*p1 = "lucy";   //但是p1指向的内容(即*p1 )不能改变

	p2 = b;           //const修饰的是*p2,所以p2可以改变
	//*p2 = "lucy";   //但是p2指向的内容(即*p2)不能改变

	//p3 = b;        //const修饰的是p3,所以p3不能被改变
	if (*p3==NULL)
	*p3 = *b;         //但是p3指向的内容可以被改变(即*p3)  
	system("pause");
	return 0;
}

非const对象调用非const成员函数,constant对象调用const成员函数


思考:

1. const对象可以调用非const成员函数和const成员函数吗?

2. 非const对象可以调用非const成员函数和const成员函数吗?

class Date
{
public:
	Date(int year, int month, int day)
		:_year(year)
		, _month(month)
		, _day(day)
	{}
	void Display1()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
	void Display2() const
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1(2018, 1, 1);
	d1.Display1();    //非const对象,调用非const成员函数
	d1.Display2();    //非const对象,调用const成员函数
	const Date d2(2018, 1, 1);
	//d2.Display1();   //const对象,不能调用非const成员函数
	d2.Display2();     //const对象,可以调用const成员函数
	system("pause");
	return 0;
}

答:1.const对象,不能调用非const成员函数,const对象,可以调用const成员函数

       2.非const对象,可以调用非const成员函数,非const对象,可以调用const成员函数

权限可以放大但不能缩小,const相当于只拥有读权限,非const拥有读写的权限

3. const成员函数内可以调用其它的const成员函数非const成员函数吗?

4. 非const成员函数内可以调用其它的const成员函数非const成员函数吗?

答:可以,不可以,可以,可以



### C++ `std::thread` 成员函数及其用法 #### 构造函数 构造一个新的线程对象,该线程不会关联任何执行线程。如果提供了可调用目标,则启动新线程并立即开始执行给定的目标。 ```cpp template< class Function, class... Args > explicit thread( Function&& f, Args&&... args ); ``` 此模板构造函数接受一个可调用的对象以及任意数量的参数,并将这些参数转发给可调用对象以在线程中执行[^3]。 #### join 函数 等待线程完成其操作。这会阻塞当前线程直到被join的线程结束运行。 ```cpp void join(); ``` 只有当线程已经启动(`joinable`)时才能调用此方法;否则程序行为未定义。成功返回后,线程不再处于加入状态(joinable)[^4]。 #### detach 函数 分离线程使其独立于主线程继续执行,即允许子线程在其生命周期内异步终止而无需显式地由另一个线程通过`join()`等待它。 ```cpp void detach(); ``` 一旦调用了detach(), 就不能再对该线程使用`join()`, 同样也不能再次调用`detach()`. #### swap 函数 交换两个线程的身份,包括它们各自的线程ID和其他属性。 ```cpp void swap(thread& other); ``` 互换两个线程的状态,使得原线程持有其他线程的资源,反之亦然。 #### native_handle 函数 获取平台特定的句柄,以便可以直接访问底层操作系统API来进行更细粒度的操作。 ```cpp native_handle_type native_handle(); ``` 提供对底层实现细节的访问权限,通常仅限高级用途或调试目的。 #### get_id 函数 获得与此`std::thread`实例相关联的独特标识符。 ```cpp id get_id() const; ``` 即使对于从未关联过实际OS级别的线程的默认构造对象也会返回唯一的ID值。 #### hardware_concurrency 函数 估计硬件支持的最大并发线程数。 ```cpp static unsigned int hardware_concurrency() noexcept; ``` 静态成员函数,用来估算系统上可用的核心数目,有助于决定应用程序应该创建多少个工作线程来充分利用多核处理器的能力。 #### joinable 函数 判断线程是否正在运行且尚未被连接(joined)或者脱离(detached). ```cpp bool joinable() const; ``` 如果线程既不是已销毁也不是已被分离则返回true,意味着它可以安全地被`join()`或`detach()`处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值