对return的调用顺序

return在try-catch-finally中:
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

1.e.printStackTrace()可以输出异常信息
2.-1为抛出异常的习惯写法
3.如果方法中try,catch,finally中没有返回语句,则会调用这三个语句块之外的return结果
4.finally块无论如何,不管前面是正常还是异常,都要执行。
5.finally 在try中的return之后 在返回主调函数之前执行。
-----------------------------------------------------------------------------------------------------
  1.用于捕捉异常。

    2.当try中有错误出现时,会被catch捕捉,并且做出相应的反应。

    3.当有final时,该语句块中的程序会在catch后执行【即使catch有return】,返回函数前执行。

    4.当try catch final语句块中都没有return时,程序会从语句块外部读取;否则会按照final-->catch-->try中是否有return返回。

1)有错误情况下
如果finally块中有return语句,try语句 -> catch -> finally -> finally.return
如果finally块中没有return语句,try语句 -> catch -> finally -> catch.return
2)无错误情况下
如果finally{}块中有return语句,try语句 -> finally -> finally.return
如果finally{}块中没有return语句,try语句 -> finally -> try.return

return在try-catch-finally中:
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

1.e.printStackTrace()可以输出异常信息
2.-1为抛出异常的习惯写法
3.如果方法中try,catch,finally中没有返回语句,则会调用这三个语句块之外的return结果
4.finally块无论如何,不管前面是正常还是异常,都要执行。
5.finally 在try中的return之后 在返回主调函数之前执行。

### 构造函数调用顺序分析 在C++中,构造函数调用顺序受到继承层次和初始化列表的影响。以下是关于继承、多重继承以及初始化列表对构造函数调用顺序的具体规则: #### 1. 单继承下的构造函数调用顺序 在单继承场景下,构造函数调用顺序遵循以下原则:先基类后派生类[^1]。这意味着当创建一个派生类的对象时,首先会调用基类的构造函数,然后才是派生类的构造函数。 #### 2. 多重继承下的构造函数调用顺序 在多重继承中,构造函数调用顺序与基类在派生类定义中的声明顺序一致。具体来说: - 基类构造函数按照它们在派生类继承列表中从左到右的顺序依次调用。 - 派生类的构造函数在其所有基类构造函数完成调用之后执行。 例如,在以下代码中: ```cpp class father { public: father() { cout << "father类构造函数" << endl; } }; class mother { public: mother() { cout << "mother类构造函数" << endl; } }; class son : public father, public mother { public: son() { cout << "son类构造函数" << endl; } }; ``` 构造函数调用顺序为:`father` -> `mother` -> `son`[^3]。 #### 3. 初始化列表的影响 在派生类中,可以使用初始化列表来显式调用基类的构造函数或初始化成员变量。需要注意的是,即使在初始化列表中指定了基类构造函数调用顺序,实际的调用顺序仍然由基类在派生类定义中的声明顺序决定,而非初始化列表中的顺序。 例如: ```cpp class Base1 { public: Base1(int x) { cout << "Base1构造函数" << endl; } }; class Base2 { public: Base2(int y) { cout << "Base2构造函数" << endl; } }; class Derived : public Base1, public Base2 { public: Derived() : Base2(2), Base1(1) { cout << "Derived构造函数" << endl; } }; ``` 尽管在初始化列表中`Base2`排在`Base1`之前,但由于`Base1`在继承列表中位于`Base2`之前,因此构造函数的实际调用顺序仍为:`Base1` -> `Base2` -> `Derived`[^3]。 #### 4. 组合场景下的构造函数调用顺序 在组合场景中(即一个类包含其他类的对象作为成员变量),构造函数调用顺序遵循以下规则: - 首先调用基类的构造函数(如果存在)。 - 然后按照成员变量在类中声明的顺序依次调用它们的构造函数。 - 最后调用派生类自身的构造函数。 例如: ```cpp class Member { public: Member() { cout << "Member构造函数" << endl; } }; class Composite { Member m; public: Composite() { cout << "Composite构造函数" << endl; } }; ``` 在此例中,构造函数调用顺序为:`Member` -> `Composite`。 #### 5. 析构函数调用顺序 析构函数调用顺序与构造函数相反。对于多重继承场景,析构函数按照基类声明的反向顺序调用。例如,在上述`son`类的例子中,析构函数调用顺序为:`son` -> `mother` -> `father`。 --- ### 示例代码 以下是一个综合示例,展示单继承、多重继承和组合场景下的构造函数调用顺序: ```cpp #include <iostream> using namespace std; class Base1 { public: Base1() { cout << "Base1构造函数" << endl; } ~Base1() { cout << "Base1析构函数" << endl; } }; class Base2 { public: Base2() { cout << "Base2构造函数" << endl; } ~Base2() { cout << "Base2析构函数" << endl; } }; class Member { public: Member() { cout << "Member构造函数" << endl; } ~Member() { cout << "Member析构函数" << endl; } }; class Derived : public Base1, public Base2 { Member m; public: Derived() : Base2(), Base1() { cout << "Derived构造函数" << endl; } ~Derived() { cout << "Derived析构函数" << endl; } }; int main() { Derived obj; return 0; } ``` 输出结果为: ``` Base1构造函数 Base2构造函数 Member构造函数 Derived构造函数 Derived析构函数 Member析构函数 Base2析构函数 Base1析构函数 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值