В чем разница между CCow::Function() и Function()?
Можно ли так писать код? И если да, то в чем разница между вот этим: "DisplayCowInfo()" и этим: "CCow::DisplayCowInfo()"
Cow.h
#pragma once
#include <string>
class CCow
{
public:
void ObtainCowInfo();
void DisplayCowInfo();
private:
string mName;
int mAge;
int mWeight;
}
Cow.cpp
#include "Cow.h"
#include <iostream>
using namespace std;
void DisplayCowInfo()
{
}
void CCow::ObtainCowInfo()
{
cout << "Type Cow Information" << endl;
cout << "--------------------" << endl;
cout << "Cow's name: ";
cin >> mName;
cout << endl;
// Inputting the cow's age, until valid input is inputted
cout << "Cow's age: ";
while(true)
{
cin >> mAge;
if(mAge){
break;
}
cout << "Invalid age, try again!" << endl;
}
cout << endl;
// Inputting the cow's weight, until valid input is inputted
cout << "Cow's weight: ";
while(true)
{
cin >> mWeight;
if(mWeight){
break;
}
cout << "Invalid weight, try again!" << endl;
}
cout << endl;
}
Ответы (1 шт):
Если Вы видите в коде "DisplayCowInfo()" и "CCow::DisplayCowInfo()", то это может быть как одна и та же функция, так и разные. Добавив в начало CCow::, Вы уточняете какую именно функцию Вы хотите использовать (в данном случае функцию-член класса CCow).
Когда компилятор видит просто DisplayCowInfo() - у него могут быть "варианты" - это может быть как вызов обычной функции, так функции-члена класса. Все сильно зависит от "места вызова".
Теперь посмотрим на Ваш код. У Вас в объявлении класса CCow есть только объявление функции DisplayCowInfo. Значит где то в другом месте должна быть ее реализация. И она должна иметь вид
void CCow::DisplayCowInfo()
{
}
У Вас же есть просто
void DisplayCowInfo()
{
}
то есть, обычная функция.
А теперь, что же будет происходить.
Если Вы попробуете позвать функцию CCow::DisplayCowInfo() (в коде это может выглядеть как CCow::DisplayCowInfo(), DisplayCowInfo() или даже this->DisplayCowInfo()), будет ругаться линковщик, так как он не найдет ее реализации. Пока Вы ее не вызываете, линковщику нет дела до нее и все даже скомпилируется.
Если Вы вызовите DisplayCowInfo() вне класса CCow, то все тоже будет работать - такая функция есть.
Если вызвать вот так ::DisplayCowInfo(), то будет вызвана "обычная функция" и тоже все будет работать.
Чем функция-член класса отличается от обычной функции? В первом случае есть неявный параметр this, в котором передается указатель на текущий объект.