Функции с аргументами const и перегрузкой
9179 просмотра
3 ответа
Попробовал Stacker Overflow Qn, поэтому я подумал, почему бы не перегрузить функцию, и я придумал немного другой код, но он говорит, что функция не может быть перегружена. Мой вопрос почему? или есть другой способ?
#include <iostream>
using std::cout;
class Test {
public:
Test(){ }
int foo (const int) const;
int foo (int );
};
int main ()
{
Test obj;
Test const obj1;
int variable=0;
do{
obj.foo(3); // Call the const function
obj.foo(variable); // Want to make it call the non const function
variable++;
usleep (2000000);
}while(1);
}
int Test::foo(int a)
{
cout<<"NON CONST"<<std::endl;
a++;
return a;
}
int Test::foo (const int a) const
{
cout<<"CONST"<<std::endl;
return a;
}
Автор: Sii
Источник
Размещён: 13.11.2019 11:42
Ответы (3)
21 плюса
Вы не можете перегружать, основываясь только на константности не указателя, не ссылочного типа.
Подумайте, например, если бы вы были компилятором. Столкнулся с линией:
cout <<obj.foo(3);
какую функцию вы бы назвали?
Когда вы передаете по значению, значение копируется в любом случае. Значение const в аргументе относится только к определению функции.
Автор: Dominique McDonnell Размещён: 10.09.2010 03:2716 плюса
§13.1, где Стандарт обсуждает объявления, которые не могут быть перегружены, -
Объявления параметров, которые отличаются только наличием или отсутствием const и / или volatile, эквивалентны. То есть, сопзИ и летучий типа спецификаторы для каждого типа параметра игнорируются [...]
Только const и volatile спецификаторы типа на самом внешнем уровне спецификации типа параметра игнорируются таким образом; Спецификаторы типа const и volatile, скрытые в спецификации типа параметра, имеют большое значение и могут использоваться для различения объявлений перегруженных функций. [...]
при определении, какая функция объявляется, определяется или вызывается. В частности, для любого типа T «указатель на T», «указатель на const T» и «указатель на изменчивый T» считаются различными типами параметров, как и «ссылка на T», «ссылка на const T» и «ссылка на летучий Т.»
РЕДАКТИРОВАТЬ 2:
Поскольку сообщение по существу совпадает с ссылочным сообщением , за исключением того, что перегруженные функции теперь являются функциями-членами класса, я пытаюсь проиллюстрировать дополнительный аспект, который может быть полезен для иллюстрации концепции перегрузки, которая отличается от перегрузки на основе «constness» аргументов (либо в области видимости класса, либо в пространстве имен). Однако ОП хотел знать, как различать две перегрузки.
Способ их успешной перегрузки зависит от квалификации cv подразумеваемого первого параметра в случае вызовов функций-членов, как показано. Функция-член const может быть вызвана только в том случае, если выражение объекта, используемое для вызова перегруженной функции-члена, также является const. Когда неконстантное выражение объекта используется для вызова перегруженного вызова функции-члена, предпочтительна неконстантная версия, поскольку она является точным соответствием (вызов перегруженной функции-члена const потребует квалификации cv первого подразумеваемого аргумента)
#include <iostream>
using std::cout;
class Test {
public:
Test(){}
int foo (const int) const;
int foo (int );
};
int main ()
{
Test obj;
Test const objc; // const object
obj.foo(3); // calls non const overload, object expression obj is non const
objc.foo(3); // calls const overload, object expression objc is const
}
int Test::foo(int a)
{
a++;
return a;
}
int Test::foo (const int a) const
{
return a;
}
Автор: Chubsdad
Размещён: 10.09.2010 03:26
1 плюс
В ответ на другой вопрос , объясняет, два foo
s не отличается , потому что они имеют эквивалентные определения параметров.
Вопросы из категории :
- c++ What are the barriers to understanding pointers and what can be done to overcome them?
- c++ Какой самый простой способ для анализа файла INI в C ++?
- c++ Когда вы должны использовать «друг» в C ++?
- c++ Как вы очищаете переменную stringstream?
- c++ В C ++ конструктор и деструктор могут быть встроенными функциями?
- class В чем разница между структурой и классом в .NET?
- class Когда вы должны использовать класс против структуры в C ++?
- class В чем разница между старым и новым стилем классов в Python?
- class Как сделать глубокую копию объекта в Java?
- class Возможны ли статические переменные класса?
- const В чем разница между const и readonly в C #?
- const Почему я не могу конвертировать 'char **' в 'const char * const *' в C?
- const Использование const для параметров функции
- const Как удалить дублирование кода между похожими константными и неконстантными функциями-членами?
- const Как преобразовать std :: string в const char * или char *?
- overloading При переопределении equals в Java, почему не работает использование параметра, отличного от Object?
- overloading Можете ли вы перегружать методы контроллера в ASP.NET MVC?
- overloading Перегрузка функции по типу возврата?
- overloading Перегрузка функций в Javascript - лучшие практики
- overloading Graphics.DrawRectangle (Pen, RectangleF)