初学C++, 关于类的声明与实现,要遵守“实现抽象”、“数据隐藏”的原则。因此一般将声明部分放在头文件中,类的成员函数的具体实现放在源代码文件中。但有时为了省事,将头文件中的类的成员函数的声明直接复制到代码文件中,一般情况下是不会出现问题的。但当成员函数的声明中为形参指定了实参时,这样直接复制过去就会造成:error C2575: 重定义默认参数。初学C++, 关于类的声明与实现,要遵守“实现抽象”、“数据隐藏”的原则。因此一般将声明部分放在头文件中,类的成员函数的具体实现放在源代码文件中。但有时为了省事,将头文件中的类的成员函数的声明直接复制到代码文件中,一般情况下是不会出现问题的。但当成员函数的声明中为形参指定了实参时,这样直接复制过去就会造成:error C2575: 重定义默认参数。
因此我们只需要在头文件,或者源文件中声明一次该默认参数,习惯上在头文件中声明。代码如下:
//person.h
#ifndef PERSON_H_
#define PERSON_H_
#include <string>
class Person
{
private:
static const int LIMIT = 25
std::string lname//Person's last name
char fname[LIMIT] //Person's first name
public:
Person() {lname = ""fname[0] = '\0'} //#1
Person(const std::string &ln, const char *fn = "Heyyou") //#2
~Person()
void Show() const
void FormalShow() const
}
#endif
//--------------------------------------------------------
//--------------------------------------------------------
//person.cpp
#include <iostream>
#include <string>
#include "person.h"
Person::Person(const std::string &ln, const char *fn) //#2
{
lname = ln
//fname[LIMIT] = *fn
strcpy(fname,fn)//
}
Person::~Person()
{
std::cout <<"Person class have finished!\n"
}
void Person::Show() const
{
std::cout <<fname <<lname <<std::endl
}
void Person::FormalShow() const
{
std::cout <<lname <<fname <<std::endl
}
其实准确的说,你所说的函数说明是指函数的前项声明。也就是在程序前面,一般在main前面用如下格式声明一个函数:类型+函数名+(参数类型或者默认参数)+分号你给出的这两个程序不矛盾。第一个中并没有前项声明函数,只是sum函数在main前面定义。第二个则不同,point函数在main前面是前项声明(注意void point(int x=10,y=20)这句是加了分号的),仅仅是声明没有定义,而point函数的定义是放在main后才真正定义的。
函数为什么要前项声明呢,这是因为在比较大的程序中,某些地方调用函数的时候,被调用的函数还没被定义,前项声明的作用就是在程序的最开头就声明了函数名和参数要求,那么整个程序在任何地方都可以调用这个函数。即声明的意思就是告诉整个程序,某个函数名是合法的。
换在你给的第二程序的理解为,main函数要调用point函数,如果前面没有声明,那么main函数就不认识point这个函数。你可以尝试注释掉void point(int x=10,y=20)这句,编译就会报错。但因为这个程序是非常简单的小程序,所以你可以把point函数的定义放在main前面,与此同时把oid point(int x=10,y=20)这句删除,程序也是对的。
明白了吧,你所说的第一节的SUM函数是没有你所说的“说明”的,也就是第一节的只是定义没有前项声明。第二节的首先前项声明,然后再定义的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)