Bagikan melalui


Deklarasi dan definisi (C++)

Program C++ terdiri dari berbagai entitas seperti variabel, fungsi, jenis, dan namespace. Masing-masing entitas ini harus dideklarasikan sebelum dapat digunakan. Deklarasi menentukan nama unik untuk entitas, bersama dengan informasi tentang jenisnya dan karakteristik lainnya. Di C++ titik di mana nama dideklarasikan adalah titik di mana nama menjadi terlihat oleh pengkompilasi. Anda tidak dapat merujuk ke fungsi atau kelas yang dideklarasikan di beberapa titik kemudian di unit kompilasi. Variabel harus dideklarasikan sedekat mungkin sebelum titik tempat variabel digunakan.

Contoh berikut menunjukkan beberapa deklarasi:

#include <string>

int f(int i); // forward declaration

int main()
{
    const double pi = 3.14; //OK
    int i = f(2); //OK. f is forward-declared
    C obj; // error! C not yet declared.
    std::string str; // OK std::string is declared in <string> header
    j = 0; // error! No type specified.
    auto k = 0; // OK. type inferred as int by compiler.
}

int f(int i)
{
    return i + 42;
}

namespace N {
   class C{/*...*/};
}

Pada baris 5, main fungsi dideklarasikan. Pada baris 7, const variabel bernama pi dideklarasikan dan diinisialisasi. Pada baris 8, bilangan bulat i dideklarasikan dan diinisialisasi dengan nilai yang dihasilkan oleh fungsi f. Nama f terlihat oleh pengkompilasi karena deklarasi maju pada baris 3.

Di baris 9, variabel bernama obj jenis C dinyatakan. Namun, deklarasi ini menimbulkan kesalahan karena C tidak dideklarasikan sampai nanti dalam program, dan tidak dideklarasikan ke depan. Untuk memperbaiki kesalahan, Anda dapat memindahkan seluruh definisiC sebelum main atau menambahkan deklarasi maju untuknya. Perilaku ini berbeda dari bahasa lain seperti C#. Dalam bahasa tersebut, fungsi dan kelas dapat digunakan sebelum titik deklarasi mereka dalam file sumber.

Di baris 10, variabel bernama str jenis std::string dinyatakan. Nama std::string terlihat karena diperkenalkan dalam stringfile header, yang digabungkan ke dalam file sumber di baris 1. std adalah namespace tempat string kelas dideklarasikan.

Di baris 11, kesalahan dimunculkan karena nama j belum dinyatakan. Deklarasi harus menyediakan jenis, tidak seperti bahasa lain seperti JavaScript. Di baris 12, auto kata kunci digunakan, yang memberi tahu pengkompilasi untuk menyimpulkan jenis k berdasarkan nilai yang diinisialisasi dengannya. Pengkompilasi dalam kasus ini memilih int jenis.

Cakupan deklarasi

Nama yang diperkenalkan oleh deklarasi valid dalam cakupan tempat deklarasi terjadi. Dalam contoh sebelumnya, variabel yang dideklarasikan di dalam main fungsi adalah variabel lokal. Anda dapat mendeklarasikan variabel lain bernama i di luar utama, pada cakupan global, dan itu akan menjadi entitas terpisah. Namun, duplikasi nama tersebut dapat menyebabkan kebingungan dan kesalahan pemrogram, dan harus dihindari. Di baris 21, kelas C dideklarasikan dalam cakupan namespace N. Penggunaan namespace membantu menghindari tabrakan nama. Sebagian besar nama Pustaka Standar C++ dideklarasikan dalam std namespace layanan. Untuk informasi selengkapnya tentang bagaimana aturan cakupan berinteraksi dengan deklarasi, lihat Cakupan.

Definisi

Beberapa entitas, termasuk fungsi, kelas, enum, dan variabel konstanta, harus didefinisikan serta dideklarasikan. Definisi menyediakan pengkompilasi dengan semua informasi yang diperlukan untuk menghasilkan kode mesin ketika entitas digunakan nanti dalam program. Dalam contoh sebelumnya, baris 3 berisi deklarasi untuk fungsi f tetapi definisi untuk fungsi disediakan dalam baris 15 hingga 18. Pada baris 21, kelas C dideklarasikan dan didefinisikan (meskipun seperti yang didefinisikan kelas tidak melakukan apa pun). Variabel konstanta harus didefinisikan, dengan kata lain yang diberi nilai, dalam pernyataan yang sama di mana variabel tersebut dideklarasikan. Deklarasi jenis bawaan seperti int secara otomatis merupakan definisi karena pengkompilasi tahu berapa banyak ruang yang dialokasikan untuk itu.

Contoh berikut menunjukkan deklarasi yang juga merupakan definisi:

// Declare and define int variables i and j.
int i;
int j = 10;

// Declare enumeration suits.
enum suits { Spades = 1, Clubs, Hearts, Diamonds };

// Declare class CheckBox.
class CheckBox : public Control
{
public:
    Boolean IsChecked();
    virtual int     ChangeState() = 0;
};

Berikut adalah beberapa deklarasi yang bukan definisi:

extern int i;
char *strchr( const char *Str, const char Target );

Typedefs dan menggunakan pernyataan

Dalam versi C++yang lebih lama, typedef kata kunci digunakan untuk mendeklarasikan nama baru yang merupakan alias untuk nama lain. Misalnya, jenisnya std::string adalah nama lain untuk std::basic_string<char>. Harus jelas mengapa programmer menggunakan nama typedef dan bukan nama aktual. Dalam C++modern, using kata kunci lebih disukai daripada typedef, tetapi idenya sama: nama baru dideklarasikan untuk entitas, yang sudah dideklarasikan dan ditentukan.

Anggota kelas statis

Anggota data kelas statis adalah variabel diskrit yang dibagikan oleh semua objek kelas. Karena dibagikan, mereka harus didefinisikan dan diinisialisasi di luar definisi kelas. Untuk informasi selengkapnya, lihat Kelas.

deklarasi ekstern

Program C++ mungkin berisi lebih dari satu unit kompilasi. Untuk mendeklarasikan entitas yang ditentukan dalam unit kompilasi terpisah, gunakan extern kata kunci. Informasi dalam deklarasi cukup untuk pengkompilasi. Namun, jika definisi entitas tidak dapat ditemukan di langkah penautan, maka linker akan menimbulkan kesalahan.

Di bagian ini

Kelas penyimpanan
const
constexpr
extern
Penginisialisasi
Alias dan typedefs
using Deklarasi
volatile
decltype
Atribut di C++

Baca juga

Konsep Dasar