C++函数周期

本文详细解析了C++中对象的构造与析构过程,包括不同类型的构造函数(如默认构造函数、拷贝构造函数)的使用场景,以及对象生命周期内构造与析构的调用顺序规律。

C++中的函数周期,类Good形式如下:

class Good
{
 public:
	Good(char* name= NULL,float price = 0);//默认构造函数
	~Good();//析构函数 
	Good(Good &);//拷贝构造函数 
	void operator =(Good t);//赋值运算符 
private:
	char* name;
      float price;
};

在类实例化对象时,需要注意以下两个问题

1.“类名+对象名+()” 并非实例化而是函数声明

Good G3();//函数声明
2.逗号表达式
Good *P = (Good)("b","a");//相当于调用构造函数 Good("a");
Good _G1(10,10);//全局变量在代码段,首先调用构造,最后调用析构函数
int main()
{
	Good G1(10,10);//由于函数顺序调用,先构造的后析构,后构造的先析构
	Good G2 = G1;//调用拷贝构造函数
	//Good G3();//函数声明
	static Good G4 = Good("iphone",1);//代码进行优化,Good G4("iphone",1),程序结束时析构
	G4 = Good("ipad",2);//生成临时对象,在该行代码结束时析构
	G4 = (Good)("huawei","samsung");//("huawei","samsung")为逗号表达式,调用Good("samsung"),生成临时对象
	G4 = "xiaomi";//编译器检查类型不匹配,生成临时对象,调用赋值运算符重载函数

	Good *G5 = Good("vivo",10);//生成临时对象,语句结束时析构
	Good &G6 = Good("oppo",11);//引用会使临时量的生存周期边长,与引用同时销毁
	Good *G7 = new Good();
}
Good _G2;//第二个被调用,倒数第二个被析构
综上所述,全局对象最先调用最后析构,函数内部依序构造,逆序析构,静态对象在程序结束时析构。

<think>我们正在讨论C++中的静态函数。静态函数C++中通常指静态成员函数,或者文件作用域内的静态函数C++17起已弃用文件作用域静态函数,推荐使用匿名命名空间)。这里主要讨论静态成员函数。 静态成员函数的生命周期与程序的生命周期相同,因为它们属于而不是的实例。静态成员函数在程序启动时就已经存在,直到程序结束。它们没有this指针,因此只能直接访问的静态成员(包括静态成员变量和静态成员函数)。 管理机制: 1. 静态成员函数不需要通过对象来调用,可以通过名直接调用。 2. 静态成员函数不能访问的非静态成员(因为非静态成员需要通过对象来访问)。 3. 静态成员函数可以在内或外定义,但外定义时不能重复使用static关键字。 示例: ```cpp class MyClass { public: static void staticFunction() { // 可以访问静态成员 staticVar = 10; // 不能直接访问非静态成员 // nonStaticVar = 20; // 错误 } private: static int staticVar; int nonStaticVar; }; int MyClass::staticVar = 0; // 静态成员变量定义 int main() { MyClass::staticFunction(); // 直接通过名调用 return 0; } ``` 注意:静态成员函数可以被继承,但是不能是虚函数(因为虚函数调用依赖于对象,而静态函数不依赖于对象)。 相关问题: 1. 静态成员函数与非静态成员函数的主要区别是什么? 2. 静态成员函数能否被声明为const?为什么? 3. 静态成员函数能否访问的私有成员? 4. 在C++中,静态成员函数能否被重写?</think>### C++静态函数的生命周期与管理机制 在C++中,**静态函数**分为两静态成员函数和文件作用域静态函数C++17起已弃用后者,推荐使用匿名命名空间)。它们的生命周期与管理机制如下: #### 1. **静态成员函数** - **生命周期**:与程序生命周期相同,在程序启动时初始化,程序结束时销毁。 - **访问权限**: - 无`this`指针,不能直接访问非静态成员变量/函数 - 可直接访问的静态成员变量/函数 - 可通过名直接调用:`ClassName::staticFunction()` - **内存管理**: - 不依赖于实例,存储在全局/静态存储区 - 无构造/析构过程 ```cpp class Logger { public: static void log(const std::string& msg) { // 可访问静态成员 static int callCount = 0; // 局部静态变量 callCount++; std::cout << "[" << callCount << "] " << msg; } private: static std::mutex mtx; // 静态成员声明 }; // 静态成员定义 std::mutex Logger::mtx; // 调用示例 Logger::log("System started"); // ✅ 无需实例化 ``` #### 2. **文件作用域静态函数C++17起不推荐)** ```cpp // 不推荐写法(C++17前) static void helper() { /*...*/ } // 推荐替代方案(C++17+) namespace { void helper() { /*...*/ } // 匿名命名空间实现内部链接 } ``` - **生命周期**:程序启动到结束 - **作用域**:仅在当前编译单元可见(内部链接) - **管理**:避免命名冲突,不支持外部调用 #### 关键行为特征 1. **线程安全**: - 静态函数本身是线程安全的(无实例状态) - 但访问的静态数据需额外同步(如示例中的`mtx`互斥锁) 2. **初始化顺序**: - 不同编译单元的静态对象初始化顺序不确定 - 解决方案:使用函数局部静态变量(C++11起线程安全) ```cpp static Singleton& instance() { static Singleton inst; // 首次调用时初始化 return inst; } ``` 3. **与普通函数对比**: | 特性 | 静态成员函数 | 普通成员函数 | |---------------------|--------------------|--------------------| | 调用方式 | `名::函数()` | `对象.函数()` | | 访问非静态成员 | ❌ 禁止 | ✅ 允许 | | 虚函数 | ❌ 不可声明为虚函数 | ✅ 允许 | | 多态支持 | ❌ 无 | ✅ 通过虚函数实现 | [^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值