我们什么时候应该使用*,& ,。 , - >?

时间:2010-06-10 06:38:22

标签: c++ qt

为什么我们在创建按钮时使用*字符,但我们没有将其添加到 app 实例?

#include <QApplication>
#include <QPushButton>

int main(int argc,char *argv[])
{
    QApplication app(argc,argv);
    QPushButton *button = new QPushButton("Button Text");
    QObject::connect(button,SIGNAL(clicked()),&app,SLOT(quit()));
    button->show();
    return app.exec();
}

我们应该何时使用*&.->

7 个答案:

答案 0 :(得分:7)

  • 如果要访问结构变量的成员,则应使用.
  • 如果要声明指向某个内容的指针(例如结构),则应使用*
  • 如果想要从变量中获取指针,则应使用&
  • 如果要从指针访问结构的成员,则应使用->

答案 1 :(得分:4)

new返回一个指针,因此这里使用*将按钮定义为指向QPushButton的指针,&用于引用(获取地址){ {1}},然后传递给app

connect

相当于:

button->show(); 

这是任何介绍性书籍中涵盖的所有基本C(新的除外)和C ++。

答案 2 :(得分:1)

*用于在创建对象时指示C ++中的指针。因此QPushButton *button定义了QPushButton类型的指针。该指针用于存储按钮对象所在的内存地址。另一方面,app是一个对象本身而不是一个指针。因此,它没有*。如果您通过指针访问对象的属性,则使用->否则使用.。如果你在这个级别上有语法混淆,你真的需要一本好的基础C书。

答案 3 :(得分:1)

引入了运算符->以轻松访问struct(或C ++中的类)成员。取消引用指针是评估成员(点运算符)的较低优先级。请考虑以下语法:

some_struct * pStruct;
*pStruct.somemember = 5;

*pStruct.somemember = 5;实际上相当于*(pStruct.somemember),它取消引用pStruct.somemember,而不是pStruct

因此,为了取消引用pStruct,首先要将其放入括号中,这是一些额外的字符:(*pStruct).somememberpStruct->somemember是一种速记,看起来更清晰。

答案 4 :(得分:1)

要引用对象的成员变量或方法,必须使用点运算符。

QApplication app(argc,argv);
return app.exec();

要通过指向对象的指针引用成员变量或方法,必须使用右箭头操作符 - &gt;

QPushButton* button = new QPushButton("Button Text");
button->show();

要获得在需要指向对象指针的函数时必需的对象的地址,就像在这种情况下一样,必须使用运算符的地址&amp;

QObject::connect(button,SIGNAL(clicked()),&app,SLOT(quit()));

要获取存储在某个地址的对象的值,必须使用 deference运算符*

QPushButton* button = new QPushButton("Button Text");
//*button is the value stored at address button          

答案 5 :(得分:0)

  

QPushButton * button = ...

请注意,这是button的分配,而不是*button。一定要喜欢C声明符语法:)也许它会让你减少编写QPushButton* button = ...的麻烦,但这不适用于单个声明中的多个变量。

在声明中,*表示声明的变量是指针。在表达式中,*表示解除引用。

答案 6 :(得分:0)

默认情况下,您应该不使用任何内容,只使用静态分配:

QPushButton button;
QApplication app(argc,argv);
std::string s;
int a = 0;

通过.访问类/结构成员,如:s.append( "test" )

当您将其传递给某个功能时,如果您不想要副本,请使用参考

void myFunction( std::string & s ){}

myFunction( s );

如果您不想修改参数但仍不想复制,请使用const引用:

void myFunction( const std::string & s ) {}

myFunction( s ); // we know s won't be modified

这是基本的,默认使用的是什么。你看,这很简单。当变量超出范围时,变量会自动释放。

然后是指针。您需要使用指针来动态地允许堆上的内存或免费存储。

int * p = new int[4]; // allow 4 doubles on the free store

p是4个整数的第一个元素的地址。 *p是第一个int的值。在我们的例子中,p [1]给出了第二个int的值。通过->(而不是.)访问类/结构成员。 ->相当于(*variable).

如果您将变量静态分配为:

int i = 0;

然后&i是地址,i是值。

你可能需要带有不受范围约束的变量的指针,带有地址作为参数的函数,带多态(子类指针指向基类指针)

与静态分配相反,您需要显式销毁指针。因此你使用

delete[] p; // allocated with new[]
delete p2;  // allocated with new

如果您忘记删除内存,这是您可以获得内存泄漏的地方。

这就是发明的“智能指针”的原因,这些指针会在没人需要再使用它们时自动删除它们的内容。例如,boost :: shared_ptr或者你的编译器可能支持tr1 :: shared_ptr。

像这样使用:

boost::shared_ptr< int > a( new int( 42 ) );

无需删除