为什么我们在创建按钮时使用*字符,但我们没有将其添加到 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();
}
我们应该何时使用*
,&
,.
,->
?
答案 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).somemember
。 pStruct->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 ) );
无需删除