Когда мы должны использовать *, &,. , ->? - PullRequest
0 голосов
/ 10 июня 2010

Почему мы используем символ * при создании кнопки , но мы не добавляем его в приложение экземпляр?

#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 ]

7 голосов
/ 10 июня 2010
  • Вы должны использовать ., когда хотите получить доступ к члену переменной структуры.
  • Вы должны использовать *, когда хотите объявить указатель на что-то (например, структуру).
  • Вы должны использовать &, когда хотите получить указатель на что-то из переменной.
  • Вы должны использовать ->, когда хотите получить доступ к члену структуры изуказатель.
4 голосов
/ 10 июня 2010

new возвращает указатель, следовательно, * используется здесь, чтобы определить кнопку как указатель на QPushButton, & используется для ссылки (получить адрес) app, который затем передано connect.

button->show(); 

эквивалентно:

(*button).show(); 

Это все базовые C (кроме новых) и C ++, описанные в любой вводной книге.

1 голос
/ 10 июня 2010

Чтобы обратиться к переменной-члену или методу объекта, необходимо использовать оператор .

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

Чтобы ссылаться на переменную-член или метод через указатель на объект, необходимо использовать оператор , указывающий стрелку вправо ->

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

Чтобы получить адрес объекта, который необходим, когда у вас есть функция, которая ожидает указатель на объект, как в этом случае, необходимо использовать адрес оператора &

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

Чтобы получить значение объекта, хранящегося по какому-либо адресу, необходимо использовать оператор deference *

QPushButton* button = new QPushButton("Button Text");
//*button is the value stored at address button          
1 голос
/ 10 июня 2010

Оператор -> введен, чтобы легко добраться до членов структуры (или класса в C ++).Разыменование указателя является более низким приоритетом при оценке члена (оператор точки).Рассмотрим следующий синтаксис:

some_struct * pStruct;
*pStruct.somemember = 5;

*pStruct.somemember = 5;на самом деле эквивалентно *(pStruct.somemember) и разыменовывает pStruct.somemember, а не pStruct.

Итак, чтобы разыменовать pStruct, сначала вы поставили его в скобки, то есть на несколько дополнительных символов:*.pStruct->somemember - сокращение, которое выглядит чище.

1 голос
/ 10 июня 2010

* используется для указания указателя в C ++ при создании объектов.Таким образом, QPushButton *button определяет указатель типа QPushButton.Этот указатель используется для хранения адреса памяти, где находится объект кнопки.С другой стороны, app сам объект, а не указатель.Следовательно, нет * вместе с ним.Если вы обращаетесь к свойствам объекта через указатель, вы используете ->, иначе вы используете ..Вам действительно нужна хорошая базовая книга по Си, если у вас есть путаница в синтаксисе на этом уровне.

0 голосов
/ 10 июня 2010

По умолчанию вы не должны использовать ничего, только статическое распределение:

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

Доступ к членам класса / структуры осуществляется через ., например: s.append( "test" )

Когда вы передаете его функции, если вам не нужна копия, используйте ссылку

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

myFunction( s );

Если вы не хотите изменять параметр, но по-прежнему не хотите копировать, используйте константную ссылку:

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 является значением первого целого числа. В нашем примере p [1] дает значения второго целого. Доступ к членам класса / структуры осуществляется через -> (вместо .). -> является эквивалентом (*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 ) );

И удалять его не нужно

0 голосов
/ 10 июня 2010

QPushButton * button = ...

Обратите внимание, что это присвоение button, а не *button. Должен любить синтаксис декларатора C :) Возможно, это даст вам меньше головной боли при написании QPushButton* button = ..., но это не будет работать с несколькими переменными в одном объявлении.

В объявлении * означает, что объявленная переменная является указателем. В выражении * означает разыменование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...