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 string
file 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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk