Explicit Anahtar Sözcüğü

Tek argümanlı constructor’larda explicit anahtar sözcüğünün kullanımı iyi bir uygulama kabul edilir, çünkü implicit tip dönüşümü belirsizliğe yol açabilir veya kodun okunurluğunu azaltabilir.

Mesela,

#include <string>

class Book {
private:
	std::string m_name;

public:
	Book() = default;
	Book(std::string name) : m_name(name) {}
};

sınıfından nesneler üretelim.

int main() {
	std::string currentlyReading {"Gospel of FSM"};

	Book a = currentlyReading;
	Book b = {currentlyReading};
	Book c = (currrentlyReading);
}

Burada tam olarak yapılan nedir, yani bir nesneye string atamak?

Derleyici bunları sırasıyla,

	Book a = Book(mybook)
	Book b = Book {currentlyReading};
	Book c = Book (currrentlyReading);

olarak algılar ve buna implicit tür dönüşümü denir. String türü derleyici tarafından nesneye dönüştürülmüştür ve dilin kabul ettiği bir durumdur, hatasız derlenir.

Bu davranışı tek argümanlı constructor’ın başına explicit anahtar sözcüğü ekleyerek engelleyebiliriz:

#include <string>

class Book {
       private:
	std::string m_name;

       public:
	Book() = default;
	explicit Book(std::string name) : m_name(name) {}
};

Kodu aynı main ile derlersek,

error: conversion from ‘std::__cxx11::string’ {aka ‘std::__cxx11::basic_string’} to non-scalar type ‘Book’ requested
  Book a = currentlyReading;
           ^~~~~~~~~~~~~~~~
explicit.cpp:18:28: error: converting to ‘Book’ from initializer list would use explicit constructor ‘Book::Book(std::__cxx11::string)’
  Book b = {currentlyReading};
                            ^
explicit.cpp:19:12: error: conversion from ‘std::__cxx11::string’ {aka ‘std::__cxx11::basic_string’} to non-scalar type ‘Book’ requested
  Book c = (currentlyReading);
           ~^~~~~~~~~~~~~~~~~

hatasını alırız.


C++

201 Words

2018-05-30 03:00 +0300