C++成员函数的两种实现

前言

C ++ 中成员函数两种实现: 类内实现 和 类外实现。

一、类内实现

在定义类的时候,直接定义了函数体。

#include <iostream>
using namespace std;
class Point
{
    public:
        void setPoint(int x, int y) // 实现 setPoint 函数
        {
            xPos = x;
            yPos = y;
        }
        void printPoint()
        {
            cout << "x = " << xPos << endl;
            cout << "y = " << yPos << endl;
        }
    private:
        int xPos;
        int yPos;
};

int main()
{
    Point M; // 创建类的对象 M
    M.setPoint(10,20);
    M.printPoint();

    return 0;
}

二、类外实现

在类内进行声名,类外通过作用域操作符 :: 进行实现。

类外实现的语法:

返回类型 类名 :: 成员函数名(参数列表)
{
// 函数体
}

#include <iostream>

using namespace std;

class Point
{
    public:
        void setPoint(int x, int y); // 在类内对成员函数进行声名
        void printPoint();
    private:
        int xPos;
        int yPos;
};

void Point::setPoint(int x, int y)
{
    xPos = x;
    yPos = y;
}

void Point::printPoint()
{
    cout << "x = " << xPos << endl;
    cout << "y = " << yPos << endl;
}

int main()
{
    Point M;
    M.setPoint(10,20);
    M.printPoint();

    return 0;
}

先声明,再定义。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在C++中,我们可以使用打桩技术来调试程序,以便更快地发现并解决问题。而成员函数的动态打桩可以帮助我们更好地进行代码调试。 通常,我们可以给成员函数添加一些特定的语句来输出调试信息,比如函数执行的参数、返回值、以及中间过程的一些信息等等。但这种方式不是很方便,因为需要手动添加并删除这些调试语句。 为了实现动态打桩,我们可以定义一个宏,然后在需要打桩的地方调用该宏。在宏中,我们可以输出调试信息,比如函数名、参数值等等,这样就可以让调试信息更加自动化、方便。 例如,我们可以定义一个名为DEBUG的宏,在成员函数中添加以下代码: ``` #define DEBUG(fmt, ...) \ std::cerr << __func__ << ":" << __LINE__ \ << ": " fmt "\n", ##__VA_ARGS__ ``` 在需要输出调试信息的地方,我们可以调用该宏,比如: ``` void MyClass::myFunction(int parameter) { DEBUG("parameter = %d", parameter); // ... some code ... } ``` 这样,当我们调用myFunction函数时,会输出如下调试信息: ``` myFunction:3: parameter = 123 ``` 通过这种方式,我们可以很方便地添加、删除成员函数的调试输出语句,从而更快地调试代码,解决问题。 ### 回答2: 在程序开发过程中,我们常常需要进行调试和错误排查。打桩是一种常见的调试技术,它可以记录程序执行过程中的关键信息,帮助我们分析程序中的问题。对于成员函数,我们可以使用以下几种方法动态打桩: 1.使用cout语句 我们可以在成员函数中使用cout语句输出变量的值和函数执行结果等信息,然后观察输出结果来确定程序的运行情况。例如: void MyClass::myFunc() { cout << "Starting myFunc..." << endl; // 输出提示信息 cout << "m_var1 = " << m_var1 << endl; // 输出m_var1的值 cout << "m_var2 = " << m_var2 << endl; // 输出m_var2的值 // 具体执行代码 cout << "Ending myFunc..." << endl; // 输出结束信息 } 2.使用调试工具 现代IDE和调试器都提供了丰富的调试功能,可以帮助我们动态打桩。我们可以在代码中设置断点,然后在调试器中逐步执行程序,观察变量的值和函数执行结果等信息。例如,在Visual Studio中,我们可以使用以下代码: void MyClass::myFunc() { _CrtDbgReportW(_CRT_WARN, NULL, 0, NULL, L"Starting myFunc...\n"); // 输出提示信息 _CrtDbgReportW(_CRT_WARN, NULL, 0, NULL, L"m_var1 = %d\n", m_var1); // 输出m_var1的值 _CrtDbgReportW(_CRT_WARN, NULL, 0, NULL, L"m_var2 = %d\n", m_var2); // 输出m_var2的值 // 具体执行代码 _CrtDbgReportW(_CRT_WARN, NULL, 0, NULL, L"Ending myFunc...\n"); // 输出结束信息 } 这种方法可以在程序运行时动态输出调试信息,对于一些难以复现的问题,可以帮助我们及时分析和解决。 3.使用日志文件 我们还可以将程序执行过程中的关键信息记录到日志文件中,方便后续分析和排查。我们可以在成员函数中调用日志库的接口,将信息记录到日志文件中。例如,使用log4cplus库可以使用以下代码: void MyClass::myFunc() { LOG4CPLUS_DEBUG(logger, "Starting myFunc..."); // 输出提示信息 LOG4CPLUS_DEBUG_FMT(logger, "m_var1 = %d", m_var1); // 输出m_var1的值 LOG4CPLUS_DEBUG_FMT(logger, "m_var2 = %d", m_var2); // 输出m_var2的值 // 具体执行代码 LOG4CPLUS_DEBUG(logger, "Ending myFunc..."); // 输出结束信息 } 总之,无论使用哪种方法,动态打桩都可以帮助我们快速发现程序中的问题,提高开发效率。需要注意的是,打桩代码应当在正式发布前进行清理或删除,以保证程序的安全性和可靠性。 ### 回答3: 在C++中,成员函数的打桩可以通过在函数开头和结尾插入代码实现。这些代码可以用于跟踪函数的执行时间、函数参数和返回值,以及检测函数是否正确执行。 动态打桩的一种常见方法是使用宏定义。在函数的开头和结尾处,可以使用预处理指令定义宏。这些宏将在编译时被替换为打桩代码,以便在程序运行时进行跟踪。 例如,以下示例是一个计算两个数之和的函数,可以在该函数开头和结尾处插入打桩代码: ```c++ class MyClass { public: int add(int a, int b) { TRACE_FUNCTION_START; int result = a + b; TRACE_FUNCTION_END(result); return result; } }; ``` TRACE_FUNCTION_START和TRACE_FUNCTION_END是用于打桩的宏定义。它们可以在包含打桩信息的代码块中定义,以供在函数中使用。例如: ```c++ #define TRACE_FUNCTION_START std::cout<<"Entering function "<<__FUNCTION__<<std::endl; #define TRACE_FUNCTION_END(result) std::cout<<"Exiting function "<<__FUNCTION__<<", result="<<result<<std::endl; ``` __FUNCTION__是一个特殊的编译器宏,它返回当前的函数名。通过将它与其他信息结合使用,可以创建有用的打桩信息。 在函数中插入这些宏定义后,即可在函数执行时得到以下输出: ```c++ MyClass obj; int result = obj.add(2, 3); // Output: // Entering function add // Exiting function add, result=5 ``` 通过这种方式可以轻松实现成员函数的动态打桩,方便进行调试和性能分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值