C++类常函数以及内联函数

本文介绍了一个简单的C++程序,展示了如何使用常量成员函数来判断一个年份是否为闰年,并打印日期信息。通过用户输入年月日,程序实例化Date类并调用其成员函数进行运算。

 1。请将下列代码,在2008VC环境下编译运行。

/*
 Date : 20091109
 For  : class const function and inline function
 Book : qianNeng
 Page : 276/572
 
*/
#include <iostream>
#include <iomanip>
//.............................

using namespace std;
//=============================

class Date
{
 int year,month,day;

public:
 void set(int y, int m, int d);
 bool isLeapYear()const;    // const function
 void print()const;     // conse function
};
//----------------------------------

//inline void Date::set(int y, int m, int d)
void Date::set(int y, int m, int d)
{
 year = y;
 month = m;
 day = d;
}
//KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

//inline bool Date::isLeapYear()const   // const function
bool Date::isLeapYear()const
{
 return (((0 == year % 4)
    && (0 != year % 100))
    || (0 == year % 400));
}
//ppppppppppppppppppppppppppppppppppp

//inline void Date::print()const    // const function
void Date::print()const
{
 cout << setfill('0') << endl;
 
 /*
 cout << setw( 4 ) << year << '-'
      setw( 2 ) << month << '-'  //question 1
    setw( 2 ) << day << "/n";
 */
 cout << "The date: " << year << '-'
   << month << '-' << day << " is leap year." << endl;

 cout << setfill(' ') << endl;
}
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

void main()
{
 char cEnd;
 int y1 = 2008,m1 = 8,d1 = 8;
 //Date D1;
 Date *ptrD1 = new Date;

 cout << "Please input year."<< endl;
 cin >> y1;
 if(0 >= y1)
 {
  y1 = 2009;
 }
 cout << "Please input month."<< endl;
 cin >> m1;
 if(0 >= m1)
 {
  m1 = 1;
 }
 cout << "Please input day."<< endl;
 cin >> d1;
 if(0 >= d1)
 {
  d1 = 1;
 }

 //D1.set(y1,m1,d1);
 ptrD1->set(y1,m1,d1);      //one method

 if(ptrD1->isLeapYear())
 {
  (*ptrD1).print();      //other method
 }

 delete ptrD1;

 cout << "Please intput any key to end." <<endl;
 cin >> cEnd;
 cout << " " << endl;
2  。运行的时候,是不是有异常提示?解决方法?

<think> 我们参考了上述引用内容,特别是引用[1]和[2]提到在内部定义的成员函数默认是内联的,但用户问的是在外面定义内联函数的方法。 引用[3]、[4]、[5]提供了关于内联函数的一般用法和注意事项。 根据C++标准,在外部定义内联函数的方法是在函数定义前加上`inline`关键字。 具体步骤: 1. 在声明中,只声明函数(不定义)。 2. 在外部,使用`inline`关键字定义函数。 注意:内联函数定义必须对调用者可见,因此通常将内联函数定义放在头文件中(与声明一起)。 示例: 假设有一个`MyClass`,我们想在外部定义其成员函数`myFunction`为内联函数。 头文件(如`MyClass.h`)内容: ```cpp #ifndef MYCLASS_H #define MYCLASS_H class MyClass { public: void myFunction(int x); // 声明成员函数,但不定义 }; // 在外部定义内联函数 inline void MyClass::myFunction(int x) { // 函数体 // 例如:打印x // std::cout << x << std::endl; } #endif ``` 这样,当包含这个头文件的源文件中使用`myFunction`时,编译器会尝试内联展开该函数。 注意事项: 1. 内联函数定义必须放在头文件中,因为编译器在编译每个调用该函数的源文件时都需要看到其完整定义。 2. 如果内联函数定义在多个源文件中包含,不会导致链接错误(因为内联函数具有内部链接属性,或者编译器会处理重复定义)。 3. 避免在外部定义复杂的内联函数,因为内联函数应该短小简单,否则可能导致代码膨胀。 另外,引用[5]提到:内联函数不建议声明和定义分离。因为如果分离,即将内联函数定义放在源文件(.cpp)中,而头文件中只有声明,那么当其他源文件包含该头文件并调用内联函数时,编译器在编译时看不到内联函数定义(因为定义在另一个.cpp文件中),因此无法内联,而且由于内联函数在链接时不会被当作全局函数那样处理,所以会导致链接错误(找不到函数定义)。因此,内联函数定义必须放在头文件中。 所以,在外部定义内联成员函数的方法是:在头文件中,声明之后,使用`inline`关键字定义成员函数。 如果用户需要在外部定义全局的内联函数(非成员函数),同样在函数定义前加上`inline`关键字,并将定义放在头文件中。例如: ```cpp inline int max(int a, int b) { return a > b ? a : b; } ``` 总结:在外部定义内联函数(无论是成员函数还是全局函数)都需要在函数定义前加`inline`关键字,并且将定义放在头文件中,以确保在每个使用该函数的源文件中可见。 </think> 在C++中,在外部定义内联函数的方法如下: ### 外部定义内联函数的正确方法 1. **声明与定义分离时** 在头文件中声明函数时使用`inline`关键字,并在外部定义时也使用`inline`: ```cpp // 头文件 MyClass.h class MyClass { public: void myFunction(int x); // 内声明 }; // 在外部定义内联函数 inline void MyClass::myFunction(int x) { // 函数实现 std::cout << "Value: " << x << std::endl; } ``` 2. **全局内联函数** 直接在全局作用域定义(无需关联): ```cpp inline int max(int a, int b) { return (a > b) ? a : b; } ``` ### ⚠️ 关键注意事项 1. **定义必须放在头文件中** 内联函数定义需对调用者可见(通常置于头文件),否则链接时会报错(LNK2019)[^5]。 错误示例:将内联函数定义放在`.cpp`文件,声明在头文件。 2. **避免复杂逻辑** 内联函数应保持短小,复杂函数可能导致代码膨胀(编译器可能忽略`inline`请求)[^4]。 3. **构造函数/析构函数内联** 可在外部内联定义: ```cpp class Trace { public: Trace(); // 声明 }; inline Trace::Trace() { noisy = 0; } // 外部内联定义 ``` ### 🌰 完整示例 ```cpp // MyClass.h #include <iostream> class MyClass { public: void print(int value); // 声明 }; // 外部内联定义 inline void MyClass::print(int value) { std::cout << "Value: " << value << std::endl; } ``` ### 原理解析 - **内联机制**:编译器将函数体直接插入调用处,避免函数调用开销[^4]。 - **定义等效性**:外部定义内联函数内部定义内联函数具有相同的编译行为[^2]。 --- ### 相关问题 1. 内联函数在什么情况下会被编译器忽略? 2. 内联函数与宏定义(`#define`)的主要区别是什么? 3. 为什么在外部定义内联函数时不能将声明和定义分离到不同文件? 4. 如何判断一个函数是否被成功内联?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值