我想在我的构造函数中抛出一个异常,这样我就不必处理僵尸对象了。但是,我还想预先提供一种验证方法,以便人们可以避免在没有理由的情况下“处理异常”。在 GUI中,预期无效数据并不例外。但是我也想避免代码重复和开销。GCC / Microsoft Visual C++ 编译器是否足够聪明,可以消除两次验证输入的低效率,如果没有,是否有一些微妙的变化可以取悦?
说明我的观点的示例代码块如下:
#include <string>
#include <exception>
#include <iostream>
using std::string;
using std::cout;
using std::endl;
using std::exception;
// a validation function
bool InputIsValid(const string& input) {
return (input == "hello");
}
// a class that uses the validation code in a constructor
class MyObject {
public:
MyObject(string input) {
if (!InputIsValid(input)) //since all instances of input
throw exception(); //has already been validated
//does this code incur an overhead
//or get optimised out?
cout << input << endl;
};
};
int main() {
const string valid = "hello";
if (InputIsValid(valid)) {
MyObject obj_one(valid);
MyObject obj_two(valid);
}
return 0;
}
我预计如果类的目标文件是单独生成的,这可能是不可能的,因为目标文件无法确保人们在调用构造函数之前进行验证,但是当应用程序在单个应用程序中编译并链接在一起时,是请问可以吗?