C++类成员函数的传参问题

  最近代码中经常会出现,成员函数传参经常会发生值传不进去的情况,也是比较低级的错误,这里整理一下供大家参考一下。



   (1)成员变量名与形参名相同

World::World(unsigned maxContacts, unsigned iterators)
{
    resolver = iterators;
    maxContacts = maxContacts;
    contacts = new ParticleContact[maxContacts];
    calculateIterations = (iterators == 0);
}  

  这里看一下第4行代码。这里本意是把成员函数的形参传给成员变量,命名的时候两者正好重名。这样写并没有语法错误,但是会导致形参无法传给成员变量。修改方法如下:

World::World(unsigned maxContacts, unsigned iterators)
{
    resolver = iterators;
    World::maxContacts = maxContacts;
    contacts = new ParticleContact[maxContacts];
    calculateIterations = (iterators == 0);
}

  此外,还有另一种方法如下:

World::World(unsigned maxContacts, unsigned iterators)
{
    resolver = iterators;
    this->maxContacts = maxContacts;
    contacts = new ParticleContact[maxContacts];
    calculateIterations = (iterators == 0);  }  


   (2)类实例赋值给指针

void Particle::SetParticle(Particle particle)
{
     /*m_particle为指针*/
     m_particle = &particle;
}

  这里由于形参particle为局部变量,即使m_paritcle已经指向了了particle,但是运行完这个函数,m_particle指向的还是空的地址。所以,一种方案是加引用,另一种方案就是直接传指针,代码如下:

void Particle::SetParticle(Particle& particle)
{
     /*m_particle为指针*/
     m_particle = &particle;
}

  

void Particle::SetParticle(Particle* particle)
{
     /*m_particle为指针*/
     m_particle = &particle;
}


  暂时就这么多,以后遇到继续补充。

  

时间: 2024-10-23 23:50:19

C++类成员函数的传参问题的相关文章

让类成员函数指针成为可调用对象

类成员函数指针实践上是一个指针类型,不可直接通过调用运算符()作为可调用对象调用,一般调用该类成员函数指针需要指定该指针对应的对象. 一般情况下调用类成员函数指针: // a.h #ifndef A_H #define A_H #include <iostream> using std::cout; using std::endl; class A{ public:     void print(); }; #endif // a.cpp #include "a.h" vo

理解ATL中的一些汇编代码(通过Thunk技术来调用类成员函数)

我们知道ATL(活动模板库)是一套很小巧高效的COM开发库,它本身的核心文件其实没几个,COM相关的(主要是atlbase.h, atlcom.h),另外还有一个窗口相关的(atlwin.h), 所以拿来学习应该是很方便的.但是因为ATL的代码充满了模板和宏,内部还夹杂着汇编,所以如果没有比较丰富的C++模板和系统底层的知识,一般人会看得一头雾水. 下面我们主要分析一下ATL中的一些汇编代码. ATL中出现汇编代码主要是2处,一处是通过Thunk技术来调用类成员函数处理消息:还有一处是通过打开_

类成员函数的重载、覆盖和隐藏区别?

1.重载是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同).实现原理上:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的).如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;.那么编译器做过修饰后的函数名称可能是这样的:int_func.str_func.对于这两个函数的调用,在编

C#为什么不能像C/C++一样的支持函数只读传参

C#为什么不能像C/C++一样的支持函数只读传参? 这个问题其实问的人挺多的,我自己也经常想实现这个功能,但是发现总是那么的不尽人意. 有些人倒是给出了一下答案,但是都不能很好的解决像C/C++一样的支持函数只读传参这个问题. 其实这块我觉得我们可能有个误区.就是我们为什么要这样做呢?这样做的目的是什么?对了就是这个.答案也在这里面.关键就在这目的上.我们用C/C++可能有 function(Data const * const pcData),但是在C#里面没有了.感觉似乎少了点什么.对就是少

类成员函数的指针与多态性

1 类成员函数的指针 2 类成员函数的指针数组 3 指向类成员函数的指针的指针 1 类成员函数的指针 auto func1 = &com::jia;//C++函数指针 int (com::*p)(int, int) = &com::jia;//C函数指针 1 #include <iostream> 2 3 class com 4 { 5 private: 6 int a; 7 int b; 8 public: 9 com(int x, int y) :a(x), b(y) 10

C++ 获取类成员函数地址方法 浅析

C语言中可以用函数地址直接调用函数: void print () { printf ("function print"); } typdef void (*fun)(); fun f = print; f(); C++中类非静态成员函数必须通过实例去调用,C++中类成员函数调用: class test { public: void print () { printf ("function print"); } }; 我们同样可以通过定义函数指针来调用如下: type

C++的const类成员函数

转自:http://blog.csdn.net/lihao21/article/details/8634876 我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如, [cpp] view plain copy const char blank = ''; blank = '\n';  // 错误 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员.若要修改类对象,应调用公有成员函数来完成.为了保证const对象的常量性,编译器

C++:类成员函数的重载、覆盖和隐藏区别?

#include <iostream> class A { public: void func() { std::cout << "Hello" << std::endl; } void func(int k) { } }; class B : public A { public: using A::func; // 把这句注释掉试试,嘿嘿 void func(int i) { } }; int main() { B b; b.func();//编译

一个类成员函数的局部静态变量问题

之前工作中遇到一个问题,就像题目中描述的那样,看起来题目有些拗口复杂,这里解释下,当时遇到的需求需要这样处理:调用某个类对象的某个成员函数时,第一次有具体意义的,其他时候都是保持不变的.无意义的.这个需求可以看做是在调用某成员函数时,第一次进行初始化,其他时候不进行操作,即在首次调用时进行初始化,根据这点,很容易想到c/c++里面的static变量,它的作用是保持变量内容的持久,存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化.根据需求,使用static局部变量,写下