2016-03-03 9 views
4

Скажем, у меня есть простая функция:Когда объект стека внутри построенного вызова функции?

void foo(int val) { 
    if(val == 0) { 
     return; 
    } 
    else { 
     stringstream ss; 
     ss << "Hello World" << endl << ends; 
     cout << ss.str(); 
    } 
} 

Если я вызываю функцию с val == 0, делает stringstream объект SS когда-нибудь построили? Я подозреваю, что нет, но просто хочу подтвердить.

+1

Нет, 'ss' не создается, поскольку он находится в другом объеме, который никогда не вводится. – callyalater

+3

Легко сказать: просто поместите класс, который вы написали, вместо 'stringstream' (например, расширите' stringstream'), и пусть его конструктор и деструктор выводят некоторые сообщения. Вы можете точно определить момент, когда каждый объект создается и разрушается. – axiac

+0

@axiac, это умный трюк. Я попробую, чтобы в следующий раз я хочу посмотреть, будет ли объект создан. – PentiumPro200

ответ

4

Именно так полезны области применения на C/C++: не создавать объекты, которые вы не хотите создавать.

Здесь ваш объект stringstream должен строиться только в том случае, если вы проникнете в его область действия, определенную фигурными скобками else.

Нет, ваш объект не будет построен, если val == 0.

1

Поскольку программа не будет работать до этой точки, этот строковый поток не будет создан.

6

Нет. Вы можете легко подтвердить это, используя свой собственный объект и поместив что-то в конструктор. Например:

class TestClass { 
    public: 
     TestClass() { cout << "Construct TestClass" << endl; }; 
}; 

void foo(int val) { 
    if(val == 0) { 
     return; 
    } 
    else { 
     TestClass myTest; 
     cout << "In else" << endl; 
    } 
}