19 Ekim 2021 Salı

MYSQL CMD Ayarlamaları

Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. Tüm hakları saklıdır.

C:\Users\skocer>cd ..\..\..

C:\>cd "Program Files"

C:\Program Files>cd MySQL

C:\Program Files\MySQL>cd "MySQL Server 5.6"

C:\Program Files\MySQL\MySQL Server 5.6>cd bin

C:\Program Files\MySQL\MySQL Server 5.6\bin>show databases:
'show' is not recognized as an internal or external command,
operable program or batch file.

C:\Program Files\MySQL\MySQL Server 5.6\bin>
C:\Program Files\MySQL\MySQL Server 5.6\bin>
C:\Program Files\MySQL\MySQL Server 5.6\bin>mysql -u root -p
Enter password: *******
mysql: Unknown OS character set 'cp857'.
mysql: Switching to the default character set 'latin1'.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4334
Server version: 5.6.34-log MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
mysql>
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| customers          |
| davdb              |
| library            |
| loginex            |
| mysql              |
| okul               |
| otmex              |
| performance_schema |
| personalinfo       |
| ressamdunyasi      |
| sakila             |
| sampledb           |
| springmvctarif     |
| test               |
| usersdb            |
| world              |
+--------------------+
17 rows in set (0.00 sec)

mysql> use springmvctarif
Database changed
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| customers          |
| davdb              |
| library            |
| loginex            |
| mysql              |
| okul               |
| otmex              |
| performance_schema |
| personalinfo       |
| ressamdunyasi      |
| sakila             |
| sampledb           |
| springmvctarif     |
| test               |
| usersdb            |
| world              |
+--------------------+
17 rows in set (0.00 sec)

mysql> --character-set-server=utf8mb4
    -> \h

For information about MySQL products and services, visit:
   http://www.mysql.com/
For developer information, including the MySQL Reference Manual, visit:
   http://dev.mysql.com/
To buy MySQL Enterprise support, training, or other products, visit:
   https://shop.mysql.com/

List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
?         (\?) Synonym for `help'.
clear     (\c) Clear the current input statement.
connect   (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
ego       (\G) Send command to mysql server, display result vertically.
exit      (\q) Exit mysql. Same as quit.
go        (\g) Send command to mysql server.
help      (\h) Display this help.
notee     (\t) Don't write into outfile.
print     (\p) Print current command.
prompt    (\R) Change your mysql prompt.
quit      (\q) Quit mysql.
rehash    (\#) Rebuild completion hash.
source    (\.) Execute an SQL script file. Takes a file name as an argument.
status    (\s) Get status information from the server.
tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
use       (\u) Use another database. Takes database name as argument.
charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings  (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.

For server side help, type 'help contents'

    -> \c
mysql>
mysql>
mysql> character_set_server utf8mb4character_set_server utf8mb4^Z^Z
    -> \c
mysql>
mysql>
mysql> character_set_server utf8mb4
    -> \c
mysql> character-set-server = utf8mb4
    -> character-set-server = utf8mb4;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'character-set-server = utf8mb4
character-set-server = utf8mb4' at line 1
mysql> show variables like "%coll%";
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | latin1_swedish_ci  |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8_general_ci    |
+----------------------+--------------------+
3 rows in set (0.00 sec)

mysql> show variables like "%char%";
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | latin1                                                  |
| character_set_connection | latin1                                                  |
| character_set_database   | utf8mb4                                                 |
| character_set_filesystem | binary                                                  |
| character_set_results    | latin1                                                  |
| character_set_server     | utf8                                                    |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.6\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)

mysql> set character_set_client = 'utf8mb4';
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'character_set_client';
+----------------------+---------+
| Variable_name        | Value   |
+----------------------+---------+
| character_set_client | utf8mb4 |
+----------------------+---------+
1 row in set (0.00 sec)

mysql> show variables like 'character_set_client';show variables like 'character_set_client';show variables like 'character_set_client';show variables like 'character_set_client';show variables like 'character_set_client';show variables like 'character_set_client';show variables like 'character_set_client';show variables like 'character_set_client';
+----------------------+---------+
| Variable_name        | Value   |
+----------------------+---------+
| character_set_client | utf8mb4 |
+----------------------+---------+
1 row in set (0.00 sec)

+----------------------+---------+
| Variable_name        | Value   |
+----------------------+---------+
| character_set_client | utf8mb4 |
+----------------------+---------+
1 row in set (0.00 sec)

+----------------------+---------+
| Variable_name        | Value   |
+----------------------+---------+
| character_set_client | utf8mb4 |
+----------------------+---------+
1 row in set (0.00 sec)

+----------------------+---------+
| Variable_name        | Value   |
+----------------------+---------+
| character_set_client | utf8mb4 |
+----------------------+---------+
1 row in set (0.00 sec)

+----------------------+---------+
| Variable_name        | Value   |
+----------------------+---------+
| character_set_client | utf8mb4 |
+----------------------+---------+
1 row in set (0.00 sec)

+----------------------+---------+
| Variable_name        | Value   |
+----------------------+---------+
| character_set_client | utf8mb4 |
+----------------------+---------+
1 row in set (0.00 sec)

+----------------------+---------+
| Variable_name        | Value   |
+----------------------+---------+
| character_set_client | utf8mb4 |
+----------------------+---------+
1 row in set (0.00 sec)

+----------------------+---------+
| Variable_name        | Value   |
+----------------------+---------+
| character_set_client | utf8mb4 |
+----------------------+---------+
1 row in set (0.00 sec)

mysql>
mysql> set character_set_server = 'utf8mb4';
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like "%coll%";
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | latin1_swedish_ci  |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

mysql> character-set-connection = utf8mb4;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'character-set-connection = utf8mb4' at line 1
mysql> show variables like "%coll%";
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | latin1_swedish_ci  |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

mysql> set character_set_server = 'utf8mb4';mysql> Ctrl-C -- exit!
mysql> Ctrl-C -- exit!
mysql> Ctrl-C -- exit!

mysql>
mysql> character-set-server = utf8mb4_unicode_ci
    ->
    -> \n
ERROR:
Unknown command '\n'.
    -> character-set-server = utf8mb4_unicode_ci;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'character-set-server = utf8mb4_unicode_ci

\n
character-set-server = utf8mb4_uni' at line 1
mysql> character-set-server = utf8mb4_unicode_ci;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'character-set-server = utf8mb4_unicode_ci' at line 1
mysql> show variables like "%coll%";
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | latin1_swedish_ci  |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

mysql>
mysql>
mysql> show variables like "%coll%";
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | latin1_swedish_ci  |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

mysql> show variables like "%char%";
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | utf8mb4                                                 |
| character_set_connection | latin1                                                  |
| character_set_database   | utf8mb4                                                 |
| character_set_filesystem | binary                                                  |
| character_set_results    | latin1                                                  |
| character_set_server     | utf8mb4                                                 |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.6\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)

mysql> character_set_server=utf8mb4;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'character_set_server=utf8mb4' at line 1
mysql> character_set_server='utf8mb4';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'character_set_server='utf8mb4'' at line 1
mysql> set character_set_server = 'utf8mb4';
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql>
mysql>
mysql> show variables like "%char%";
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | utf8mb4                                                 |
| character_set_connection | latin1                                                  |
| character_set_database   | utf8mb4                                                 |
| character_set_filesystem | binary                                                  |
| character_set_results    | latin1                                                  |
| character_set_server     | utf8mb4                                                 |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.6\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)

mysql> show variables like "%coll%";
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | latin1_swedish_ci  |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

mysql> set character_set_connection = 'utf8mb4';
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like "%coll%";
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

mysql> show variables like "%char%";
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | utf8mb4                                                 |
| character_set_connection | utf8mb4                                                 |
| character_set_database   | utf8mb4                                                 |
| character_set_filesystem | binary                                                  |
| character_set_results    | latin1                                                  |
| character_set_server     | utf8mb4                                                 |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.6\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)

mysql> set character_set_result = 'utf8mb4';
ERROR 1193 (HY000): Unknown system variable 'character_set_result'
mysql> set character_set_results = 'utf8mb4';
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like "%char%";
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | utf8mb4                                                 |
| character_set_connection | utf8mb4                                                 |
| character_set_database   | utf8mb4                                                 |
| character_set_filesystem | binary                                                  |
| character_set_results    | utf8mb4                                                 |
| character_set_server     | utf8mb4                                                 |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.6\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)

mysql> show variables like "%char%";
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | utf8mb4                                                 |
| character_set_connection | utf8mb4                                                 |
| character_set_database   | utf8mb4                                                 |
| character_set_filesystem | binary                                                  |
| character_set_results    | utf8mb4                                                 |
| character_set_server     | utf8mb4                                                 |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.6\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)

mysql> show variables like "%coll%";
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

mysql> show variables like "%coll%";
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

mysql> show variables like "%coll%";
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

mysql> show variables like "%char%";
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | utf8mb4                                                 |
| character_set_connection | utf8mb4                                                 |
| character_set_database   | utf8mb4                                                 |
| character_set_filesystem | binary                                                  |
| character_set_results    | utf8mb4                                                 |
| character_set_server     | utf8mb4                                                 |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.6\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)

mysql> set character_set_system = 'utf8mb4';
ERROR 1238 (HY000): Variable 'character_set_system' is a read only variable
mysql> show variables like "%char%";mysql> Ctrl-C -- exit!
mysql> Ctrl-C -- exit!
mysql> Ctrl-C -- exit!

mysql>
mysql>
mysql> show variables like "%char%";
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | utf8mb4                                                 |
| character_set_connection | utf8mb4                                                 |
| character_set_database   | utf8mb4                                                 |
| character_set_filesystem | binary                                                  |
| character_set_results    | utf8mb4                                                 |
| character_set_server     | utf8mb4                                                 |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.6\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)

mysql> show variables like "%coll%";
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

mysql> set collation_connection = utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like "%coll%";
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_unicode_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

mysql> set collation_server = utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like "%coll%";
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_unicode_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

mysql> show variables like "%coll%";
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_unicode_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

mysql> show variables like "%char%";
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | utf8mb4                                                 |
| character_set_connection | utf8mb4                                                 |
| character_set_database   | utf8mb4                                                 |
| character_set_filesystem | binary                                                  |
| character_set_results    | utf8mb4                                                 |
| character_set_server     | utf8mb4                                                 |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.6\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)

mysql> set collation_server = utf8mb4_bin
    -> set collation_server = utf8mb4_unicode_ci;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'set collation_server = utf8mb4_unicode_ci' at line 2
mysql>
mysql>
mysql> set collation_server = utf8mb4_ci;
ERROR 1273 (HY000): Unknown collation: 'utf8mb4_ci'
mysql> set collation_server = utf8mb4_bin;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like "%char%";
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | utf8mb4                                                 |
| character_set_connection | utf8mb4                                                 |
| character_set_database   | utf8mb4                                                 |
| character_set_filesystem | binary                                                  |
| character_set_results    | utf8mb4                                                 |
| character_set_server     | utf8mb4                                                 |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.6\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)

mysql> show variables like "%coll%";
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_unicode_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_bin        |
+----------------------+--------------------+
3 rows in set (0.00 sec)

mysql> set collation_connection = utf8mb4_bin;
Query OK, 0 rows affected (0.00 sec)

mysql> set collation_database = utf8mb4_bin;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like "%coll%";
+----------------------+-------------+
| Variable_name        | Value       |
+----------------------+-------------+
| collation_connection | utf8mb4_bin |
| collation_database   | utf8mb4_bin |
| collation_server     | utf8mb4_bin |
+----------------------+-------------+
3 rows in set (0.00 sec)

mysql>

The server time zone value 'T?rkiye Standart Saati' is unrecognized or represents more than one time zone. Hatasi MYSQL

Bu hata MYSQL de time zone tanimlanmadigi icin olusuyor.

Oncelikle MySQL Notifier uzerinden server a stop haline getir. ( Bu islemler MySQL Server 5.6 icin gecerlidir.)

MYSQL sitesinden

timezone_2017b_posix

dosyasini indir.


Bu klasorun icindeki dosyalari kopyala.


C:\ProgramData\MySQL\MySQL Server 5.7\Data\mysql

e yapistir.

Ardindan  C:\ProgramData\MySQL\MySQL Server 5.7\Data\ uzantisinda my.ini dosyasi icerisinde

utf8 olan kisimlarin hepsini utf8mb4 yap.  ve asagidaki kisimlari bu dosya uzerinde duzelt.

[client]

# pipe
# socket=0.0
port=3306
default-character-set=utf8mb4

[mysql]
no-beep

default-character-set=utf8mb4
[mysqld]

default-time-zone = '+00:00'
character-set-client-handshake = FALSE
collation-server = utf8mb4_unicode_ci


Butun bu adimlar bittikten sonra MySQL Notifier uzerinden server'i RUN et.

http://www.geeksengine.com/article/populate-time-zone-data-for-mysql.html

https://stackoverflow.com/questions/5510052/changing-the-connection-timezone-in-mysql/16946123#16946123

https://stackoverflow.com/questions/9144250/mysql-timezone-on-windows-7-not-updated



Aşağıdakini cmd ya yazarsak ta işimize yarayabilir


mysql_tzinfo_to_sql /Desktop/time zones mysql/timezone_2017b_posix_sql | mysql -u root -p password mysql



23 Ekim 2017 Pazartesi

c++ önemli notlar


  • C++ 'da Interface yoktur. Interface gibi kullanılan Abstract class'lar vardır.
  • Abstract class'lardan nesne üretilemez sadece interface gibi hizmet verirler yani extend edilmelidir.
  • Abstract class olabilmesi için Javada'ki gibi en az bir methodun sadece declare edilmesi gerekiyor. C++'da bu işlem pure virtual functions tanıtılarak yapılır.  Yani içi implement edene göre değiştirilmelidir. 
  • Inheritence yapabilmek için class'lar türetilir. Base class'ta bulunan bir method türetilen class'ta Override edilebilmesi için base class'ta, virtual olarak tanıtılmalıdır. Override işlemi Java'daki gibi @Override olarak yapılmaz. Fonksiyon tanıtımına override yazılması önerilir. ( void override print() )
  • C ++ 'tada Java da olduğu gibi private class üyelerine sadece ilgili class'tan erişilebilir. Inheritance yapılsa bile Deriverid class'tan erişilemez. Bunları set etmek   için constructor veya setter/getter kullanmalıyız. ( super() veya get/set )
  • C++ da new() operatoru  return olarak bir pointer döndürür. Bu sebepten aşağıdaki gibi kullanılabilir.
A * a = new A();
Pointer nesnesi değilde normal nesne üretmek istersek

A  a =  A();
veya

A  a ;
yazılmalıdır.

A * a = new A();
şeklinde pointer nesnesi üretildikten sonra iş bitiminde 

delete a;
yazılarak delete edilmelidir. Çünkü new() ile oluşturulan pointer nesnesi heap'te bir alanı Alloc() eder ve delete yapılmadan o alanı dealloc etmez. Dealloc edilmediği için ise RAM'de hep yer kaplar ve RAM alanı bitebilir.

Ama normal nesne oluşturulunca (pointer olmayan) , bu otomatik olarak dealloc olur.

  • C++ 'ta this keyword'ü pointer'dır. Yani aynı class'ın elemanlarıne erişirken this->name  şeklinde erişim sağlanır.

Örnek Kod:

Visual Studio'da yazıldı.
-------------------------------Person.h--------------------------------------------------------------------------------


#pragma once
class Person
{
public:
int age;
string name;

void greet() {
cout << "My name is  " << this->name << "  My age is  " << this->age << endl;

}
};


-------------------------------------------ConsoleApplication1.cpp-----------------------------------------------

#include "stdafx.h"
#include "Person.h"

int main(int argc, char* argv[])
{
Person  p;

p.name = "Serdar KOCER";
p.age = 26;

Person *p2 = new Person();

p2->age = 27;
p2->name = "Hakan";


cout << p.age << "\t" << p.name << endl;
cout << p2->age << "\t" << p2->name << endl;


p.greet();
p2->greet();
delete p2;

getchar();
    return 0;
}


-----------------------------------------------stdafx.h-----------------------------------------------------------------

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#pragma once

#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;




// TODO: reference additional headers your program requires here

---------------------------------------------------------------------------------------------------------------------

Önemli Not:

C ++'ta new() keyword'ü ile yaratılan pointer nesneleri delete edilmesi gereklidir. 
Bu bilgiye göre bir nesne içerisinde yada constructor'unda bir pointer nesnesini new() ile yaratıyorsa bunu delete edip dealloc etmelidir. 

Bunu iki şekilde yapar. 

Referans:



1. Şekil destructor içinde

Örnek olarak vericek olursak,

-----------------------------------------------Person.h----------------------------------------------------------------


#pragma once
#include "Address.h"

class Person
{
public:
int age;
string name;
Address* addres;

Person(int age, string name, string city, int house_number) {

this->age = age;
this->name = name;

if (addres != nullptr)
{
std::cout << "Address Ptr is not null" << std::endl;
delete addres;
}
addres = new Address();
this->addres->city = city;
this->addres->house_number = house_number;

}
~Person() {
delete this->addres;
}
void greet() {
cout << "My name is  " << this->name << "  My age is  " << this->age << endl;

}
};
---------------------------------------------------------------------------------------------------------------------

Address tipinde bir pointer nesnesi, Person nesnesi yaratılırken yaratılıyor. Ardından bu pointer nesnesinin delete edilmesi gerekiyor ki Heap RAM'de tuttuğu alanı dealloc etsin. Buna bakarsak destructor içinde Address pointer nesnesini dealloc ediyor. Yani manuel olarak biz bunu yapıyoruz. 

2. Otomatik olarak delete yapmak. ( Smart Pointers)

C++ programlama dilinde en çok yapılan hatalardan birisi bellek yönetimi hatalarıdır. Sistemden alınan  ve iş bittikten sınra geri verilmeyen bellek, veya geri verilmiş belleğe bakmaya devam eden pointerlar kullanmak vs.


İşte bu iki genel hatadan korunmak için smart pointer'lar geliştirilmiştir.


Smart pointerlar , normal pointerlar gibi kullanılabilinen ama belli koşullarda işaret ettikleri nesne üzerinde delete komutunu çağırıp, sisteme geri verilmesini sağlayan sınıflardır.

Basitten karmaşığa doğru sıralarsak;
  1. scoped_ptr,
  2. auto_ptr,
  3. shared_ptr,
  4. weak_ptr
Bu üç smart pointer tipini kullanırsak, kodun hiç bir yerinde delete komutunu kullanmaya gerek duymayız.


1.) Scope_ptr:

scope_ptr en basit smart pointer olup, yaptığı iş sadece bir nesneye işaret etme ve o nesnenin tek sahibi olup, silinirkende nesneyide kendisi ile birlikte silmek.


Void hede(){
T* t = new T();
// bişeyler yap
*
*
*
*
delete t;
}

Yukarıdaki kodada görüleceği gibi pointer nesnesi delete edilmelidir ama problem burada şu ki delete edilmeden kodun bir yerlerinde method'tan  return edilirse, nesne delete edilemeyecek ve t nesnesini sızdırmış olacağız.

İşte böyle bir durumda sızıntı ile karşılaşmamak için scope_ptr kullanırız.



Void hede(){
boots::scoped_ptr<T> p( new T () );
//birşeyler yap
*
*
*
}
Bu şekilde p smart pointerı yeni T nesnesine göre yaratılıyor ve initialize ediliyor. Ardından fonksiyondan nasıl return ederse etsin, yerel stack değişkeni olduğundan fonksiyondan çıkarken destructor çağrılıyor ve kendi destructor'ı içerisinde otomatik olarak delete çağrılıyor. Böylece sızıntı olmuyor.

Scope_ptr'nın özelliği, kopyalanamaması ve atanamaması. Bunun sebebi scoped_ptr'nın sadece bir objeye sahip olması ve bu sahipliği bir scoped_ptr nesenesine devredememesidir. Bu özel olarak böyle yapılmıştır.



boots::scoped_ptr<T> p1( new T() );
boots:scoped_ptr<T> p2(p1) ; // olmaz!!! derleme hatası verir//copy
boots::scoped_ptr <T> p3;
p3=p1; // olmaz!! derleme hatası verir. scoped_ptr'ya aykırı davranış.//copy

Bu kısıtlamadaki amaç, programcının yarattığı nesnenin ömrü ile ilgili daha net kod yazmasını sağlayarak, gelecekte olası problemleri önlemek.

scoped_ptr'nın kopyalanamaz ve atanamaz olması, kullanımını daha kolay yapmaktadır.



2.) Auto_ptr:

Scope_ptr'dan bir adım daha akıllı bir smart pointer'dır. 

Tıpkı scoped_ptr gibi auto_ptr da bir nesnenin sahibidir, ve kapsam dışına çıkılırken o nesnenin silinmesini sağlar.



void hede(){
   std::auto_ptr<T> p ( new T() );
    p->hodo();
*
*
*
} // kapsam dışına çıkılırken, yani stackten çıkılırken T nesnesi silinir.

Böylelikle olası bir return durumu ve exception durumları için bellek sızdırmama garantisi verilmiş olunur.

Bu smart pointerın, scoped_ptr'dan en büyük farkı, kopyanabilir ve atanabilir. Kopyalama ve atama durumlarında nesne el değiştirir. Yani  bir nesneye herhangi bir anda yalnız bir auto_ptr sahip olabilir. Diğerauto_ptr bu şekilde sahiplik kaybettiğinden resetlenir.




void hede(){
std::auto_ptr<T> p1( new T() );
p1->hodo();
std::auto_ptr<T> p2 (p1);// şu anda p1 nesnesi resetlendi. Çünkü aynı anda tek bir auto_ptr                                                      aynı    nesneyi   gösterebilir.
p2->hodo();
td::auto_ptr<T> p3;
p3=p2;             //artık p2 de resetlendi.
p1->hodo();         // !!! çalışma zamanı hatası- çünkü bu auto_ptr resetlendi.
p2->hodo();     // !!! çalışma zamanı hatası- çünkü bu auto_ptr resetlendi.
p3->hodo();     // OK. Çünkü şuan nesne p3 auto_ptr'ya ait.
} // p1 ve p2 resetlendiği için fonksiyon dışına çıkınca hiç bişey yapılmıyor ama p3 auto_ptr nesneyi siliyor.

auto_ptr smart pointer, sahip oldukları nesneyi kopyalama ve atama yoluyla birbirlerine devredebilirler. Bu sebeple bazı durumlarda fonksiyonlara argüman olarak geçirilmeye ve ya fonksiyonlardan return ettirilmeye müsaitlerdir.

Önemli:
Son olarak, auto_ptr ve  scoped_ptr class'larda class üye değişkeni olarak da kullanılabilir. Bu sayede kullanıldıkları classın destructor'ının içinde delete çağrılmasına gerek kalmamış olur.


class T {
public: 
      T(): u( new U() ) {} // ilkleme listesinde sistemden alınıyor.
     ~T(); // burada delete yapmaya gerek yok çünkü nesnenin kapsamı bitti.
private:
       T(const T&);  // kopyalanamaz demek
      T& operator = ( consts T& );  //atanamaz demek
        std::auto_ptr<U> u;
}
Buradaki dikkat edilmesi gereken şey, kopya yapıcı ve atama operatorlerinin private yapılarak, sınıfın kopyalanamaz ve atanamaz hale getirilmesi. Nitekim sınıfın kopyalanmasına izin verseydik, bu sınıftan bir nesneyi başka bir nesneye kopyaladığımız anda, nesnelerden biri sahip olduğu nesneyi kaybedecekti.  Çünkü bir nesnenin u auto_ptr'sı diğer nesnelerinkine kopyalanacak ve sadece bir auto_ptr nesneye bakmaya devam edecekti.

3.) Unique_ptr

unique_ptr, auto_ptr yerine getirilmiş bir class'tır.
unique_ptr ile scoped_ptr arasındaki en önemli fark, 

ikiside kopyalanamaz ama unique_ptr ıle atama yapılabilir.

boost::scoped_ptr , 

std:: unique_ptr

kütüphaneler değişik. Scoped_ptr biraz eski kullanım olarak kalmış.

Kopyalama yapılamaz.

unique_ptr<Person> upPtr(new Person(25,"Serdar"));
unique_ptr<Person> up2Ptr;
up2Ptr upPtr;// Hata verir.!! kopyalama yapılamaz
veya,
unique_ptr<Person> upPtr(new Person(25,"Serdar"));
unique_ptr<Person> up2Ptr(upPtr); //Hata verir.!! kopyalama yapılamaz

Move ( taşıma ) Yapılaiblir.

unique_ptr<Person> upPtr(new Person(25,"Serdar"));
unique_ptr<Person> up2Ptr = std::move(upPtr); // move yapılabilir.
MOVE yapıldıktan sonra Auto_ptr'daki gibi eski unique_ptr sıfırlanır. Aşağıdaki örneği inceleyelim.

unique_ptr<Person> upPtr(new Person(25,"Serdar"));

unique_ptr<Person> up2Ptr = std::move(upPtr); // move yapılde ve upPtr sıfırlandı


upPtr->greet(); // nullPointer Exception hatası alırız. Yanlış kullanım !!!
up2Ptr->greet(); // düzgün çalışır.


unique_ptr, auto_ptr'da olduğu gibi tek bir nesne tek bir unique_ptr tarafından gösterilebilir. Diğer unique_ptr move işleminden sonra silinir. 



4.) Shared_ptr:

Smart pointerlar içerisimnde en güçlü özelliklere ship olanıdır. Bu pointer sayesinde en zorlu bellek yönetim ve nesne ömrü problemlerini çözebiliyoruz.

shared_ptr, daha önce bahsettiğimiz scoped_ptr ve auto_ptr'ya temelde benziyor. Yine amacı bir nesneye işaret etmek ve doğru zamanda nesneyi silmek. Ancak  diğer iki smart pointerda olan bir nesneye yalnız bir işaretçinin "sahip" olma zorunluluğu yoktur. Aksine shared_ptrları kullanarak bir nesneyi birden fazla işaretçinin sahipliğine veya paylaşımına verebiliyoruz. Bşaka bir deyişle bir grup shared_ptr aynı nesneyi paylaşıyor ve paylaşan bütün işaretleçiler ortadan kalktığında, nesne de siliniyor. Bu paylaşımı kopyalama veya atama yoluyla yapılyor.


 boost::shared_ptr<T> class Yontici::YeniTYarat() {
  boost::shared_ptr<T> p1(new T() );
 this->mKayitListesi.push_back ( p1 ) ;
   return p1;
}
void App::hede() {
  boost::shared_ptr<T> p = new mYonetici->YeniTYarat();
  ....
// p ile bişeyler yap
.....
}


Yukarıdaki kodu açıklayacak olursak;


YeniTYarat methodu içinde bir p1 smart pointer yaratılıyor. Ardından p1'in bir kopyası bir vektör kabına atılıyor. Yani artık iki sahip var. Biri p1 diğeri de vektörün içindeki işaretçi. Sonra metoddan dönülürken, p1 geçici bir değişkene atılıyor. ( 3. sahip ortaya çıkıyor. )  ve hemen ardından p1 in ömrü doluyor ( kapsam sonuna gelindiği için ). Bunun ardından hede metdounun kapsamı içinde geçici işaretçi, p işaretçisine atanıyor.( bu durumda geçici işaretçinin ömrünün dolduğunu varsayabiliriz.) Artık bu anda yine iki sahip var. Biri hede kapsamı içerisindeki p, diğeri mYönetici nersnesi içerisindeki vektörde bulunan işaretçi. Hede metoundan çıkılırken p yok oluyor ve  tek sahip kalıyor. Eğer progrmaın ilerleyen aşamalarında mYönetici nesnesi herhangi bir sebeple silinirse ( en başta yarattığımız T nesnesine bakan başka shared_ptr yaratılmadıysa), o esnada vektörün içindeki shared_ptr'nın destructor'ı T nesnesini silecek. 

Görüldüğü gibi, bu şekilde shared_ptr kullanılarak nesnelerin sahipliğini istediğiniz kadar çok sayıda yere bölüştürebilir ve hiç bir zaman elinizdeki hiçbir shared_ptr'nın sallantıya düşmeyeceğinden ( silinmiş bir nesneye bakmayacağından) emin olabiliriz.



shared_ptr<Person> p(new Person()) ile

shared_ptr<Person> p = make_shared<Person> ();
ayni anlamdadir. İkiside pointer nesnesi üretir.

Ama arasindaki fark new() ile nesne uretilirken 2 kez dinamik bellek tahsisi yapilir. Buda maliyetli bir işlemdir. Bu problemin önüne geçebilmek için make_shared geliştirilmiş. Bu sayede aynı bellek tahsisi bir kez yapılır .


-----------------------------------------------Person.h----------------------------------------------------------------
// ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "Person.h"
#include "Address.h"


shared_ptr<Person> deneme() {

shared_ptr<Person> pPtr(new Person(25, "Serdar"));
shared_ptr<Person> p2Ptr(pPtr);

pPtr->greet();
p2Ptr->greet();

return p2Ptr;

}

int main(int argc, char* argv[])
{
shared_ptr<Person> returnPtr;

returnPtr = deneme();
returnPtr->greet();

getchar();
    return 0;
}
---------------------------------------------------------------------------------------------------------------------


Yukarıdaki kodu incelersek, iki shared_ptr'da aynı nesneyi (new Person(25,"Serdar")) işaret eder. Nesnenin destructor'ı en son işi biten shared_ptr tarafından çalıştırılır ve pointer dealloc edilir. 

İşleyişi açıklayacak olursak;
  • İlk olarak deneme() fonksiyonu içerisinde bir nesne üretilir ve shared_ptr tarafından gösterilir. pPtr
  • Daha sonra pPtr, p2Ptr'ya referans verilir veya kopyalanır ( aynı adresi gösteriyorlar manasında) 
  • İki shared_ptr 'da şuanda aynı nesneyi işaret etmektedir.
  • İkiside aynı nesne'nin greet() methodunu çalıştırdı.
  • Ardından return olarak bu nesneyi gösteren bir shared_ptr dönüldü.
  • Şuan hala daha ilgili nesne üzerinde işlem bitmediğinden return işleminden sonra bile nesne delete edilmedi.
  • main() içerisinde nesne başka bir shared_ptr tarafından gösterildi ve greet() methodu çalıştırıldı.
  • En son main bitince nesnenin destructor'ı çalışır ve ilgili shared_ptr tarafından nesne delete edilir.


Dikkat!! Önemli!! 


1.Nokta

int g();
void f (boost::shared_ptr<T>, int);
şeklinde tanımlanan iki metod olsun. Bunlara parametre geçerken,


boost::shared_ptr<T> p( new T() );
f( p, g() );
yapılmasında bir sakınca yoktur. Ama

f(boost::shared_ptr<T> ( new T() ), g() );
sakıncalıdır. 

Nedeni ise, C ++ standardı bu şekilde yazılan bir kodda new T(), g() ve shared_ptr yapıcısının hangi sırada çağıralacağını tanımlamamıştır. Yani bu kod çalışırken, bahsettiğimiz üç parça (new T(), g() ve shared_ptr) herhangi bir sırada çalışabilir. Dolayısıyla eğer önce new çalışır, ardından g() çalışır ve en son shared_ptr çalışırsa sızıntı tehlikesi açığa çıkar. Bu senaryoda g() methodu exception tetiklerse henüz shared_ptr yaratılmaıdğından ve kapsamdan çıkılırken destructor çağrılmayacağı için, new ile alınan T nesnesi sızdırılmış olur.



2.Nokta

class T{
public:
         boost::shared_ptr<T> p;
};
void hede(){
    
     boost::shared_ptr<T> t1( new T() );
     boost::shared_ptr<T> t2( new T() );
     .....
     .....
     t1->p = t2;
     t2->p = t1;
}

İkinci uyarı ise yukarıdaki kullanımda olduğu gibi döngüsel shared_ptr kullanım problemi. Mesela T cinsinden iki nesnemiz olsun. t1 ve t2 diyelim. T sınıfının üye değişkenlerinden biri de shared_ptr<T> tipine sahip olsun.


Burada bir şekilde kodda t1 ve t2 nesneleri birbirlerine bakan bir shared_ptr’ye sahip olmuş durumda. Yani bir işaretçi döngüsü oluşmuş. Bu durumda bir problem oluyor. Dikkat ederseniz biribirine bakan böyle iki nesne olduğu zaman, dışarıdan bu nesnelere bakan bütün shared_ptr’ler silinse bile, bu iki nesnenin içlerindeki shared_ptr’ler kaldığı sürece nesneler silinmiyor. Başka bir deyişle iki nesne birbirini hayatta tutuyor. Örneğin yukarıdaki kodda hede metodundan çıkıldığında t1 ve t2 işaretçileri yok olacak ve bizim elimizde bu iki nesneye bakan bir işaretçi kalmayacak. Bu da bir nevi sızıntı.
İşte shared_ptr’ler böyle döngüsel kullanıma uygun olmadıkları için bu durumlarda döngüleri kırmak için weak_ptr adı verilen boost işaretçilerini kullanıyoruz.



5.) Weak_ptr:

Weak pointer ile bir veya birkaç shared_ptr'nın baktığığı bir nesneye bakan bir pointer yaratabiliyoruz.  Fakat bu pointer shared_ptr'nın ssayısını arttırmıyor. Yani sahip aynı sayıda kalıyor. 


void hede(){
    
     boost::shared_ptr<int> p( new int(5) );
     boost::weak_ptr<int> q( p );
     .....
     .....
}

burada q adlı weak_ptr yaratıldığı anda hala p işaretçisi nesnenin tek sahibi. Eğer p'nin kapsamından çıkarsak, p yok olduğu anda nesne de silinecek.

Peki weak_ptr'nın normak bir işaretçiden ne farkı var o zaman? Farkı şu, weak_ptr, normal pointerlar veya shared_ptr gibi -> operatörünü desteklemiyor. Yani şöyle bir kod yazamıyoruz. 


q->hodo();
q'nun gösterdiği nesneyi kullanmanın tek yolu var oda q'dan geçici bir shared_ptr yaratmak.

     boost::shared_ptr<int> r = q.lock();
     r->hodo();
Eğer q bu anda p ölmüş ve nesne  yok olmuş ise lock() metodu null dönecek. Dolayısıyla weak_ptr böylelikle aynı nesneye bakan işaretçilerden biri delete ile nesneyi sildiğinde diğer işaretçilerin anlamsız bir adrese bakmaları problemini ( "dangling pointer" diyede bilinir. ) çözmüş oluyor. Aynı zamanda yukarıda bahsettiğimiz shared_ptr'lar ile oluşan döngüsel sızıntı probleminide çözüyor.

-----------------------------------------------Person.h----------------------------------------------------------------


#pragma once
#include "Address.h"
using namespace std;
#include <memory> // shared_ptr kütüphanesi


class Person
{
public:
int age;
string name;
shared_ptr<Address> Addressptr;

Person(int age, string name, string city, int house_number) {

this->age = age;
this->name = name;

Addressptr = shared_ptr<Address>(new Address());
Addressptr->city = city;
Addressptr->house_number = house_number;
}
~Person() {
std::cout << "Destructor Calisti!!" << std::endl;
std::cout << this->Addressptr << std::endl;
//delete this->addres; // Çalışmasnıa gerek yok.
}
void greet() {
cout << "My name is  " << this->name << "  My age is  " << this->age << endl;

}
};

unique_ptr  ve  shared_ptr genelde kullanılıyor.
---------------------------------------------------------------------------------------------------------------------

C ++ Inheritance ve Polymorphism

Örnek kodu incelyelim.

---------------------------------------Person.h------------------------------------------------------------------------

#pragma once
#include "Address.h"
using namespace std;
#include <memory>


class Person
{
private:
int age;
string name;

public:


Person(){}

Person(int age, string name) {

this->age = age;
this->name = name;

}
~Person() {
std::cout << "Destructor Calisti!!" << std::endl;
//delete this->addres;
}
virtual void greet() {
cout << "Person Inside " << endl;

}
string getName(){
return this->name;
}
int getAge() {
return this->age;
}
};



---------------------------------------Engineer.h---------------------------------------------------------------------


#pragma once
#include "Person.h"
class Engineer : public Person
{
public:
string major;
Engineer(int age, string name, string major) 
: Person(age,name), major(major)
{
}

void greet() override{

cout << "Engineer Inside  " << endl;

}

~Engineer() {
}
};

---------------------------------------ConsoleApplication1.cpp---------------------------------------------------

// ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "Person.h"
#include "Address.h"
#include "Engineer.h"


int main(int argc, char* argv[])
{
Engineer e(25, "Serdar","EEE");

cout << e.getAge() << "\t" << e.getName() << "\t" << e.major << endl;
e.greet();

Person *pPtr;

pPtr = &e;
cout << pPtr->getAge() << "\t" << pPtr->getName() << "\t" << e.major << endl;
pPtr->greet();
getchar();
    return 0;
}
--------------------------------------------------------------------------------------------------------------------------

Engineer class'ı Person Class'ını inherit ettiğini görebiliriz. Bu Person sınıfı içerisinde bulunan değişkenleri ve methodları kullanabilir ve virtual olarak tanıtılan methodları override edebilir anlamına geliyor. 

virtual olarak greet() methodu tanıtılmış ve Engineer class'ı içerisinde override edilmiştir.
Engineer class'ından nesne yaratırken constructor kullanıyoruz ve Engıneer Class'ının superi olan Person class'ınında constructor üzerinden değişkenlerini set ediyoruz.  JAVA'da super(age,name)
olarak ana class'ın constructorına erişirken burada : Person(age,name), major(major) şeklinde değişkenleri set ediyoruz. Eğer default constructor kullanılsaydı (Person'da) bu şekilde erişime gerek kalmayacaktı veya değişkenler private yerine public olarak tanıtılsaydı Person elemanlarına ( age ve name) Engineer class'ı içinden direk erişim sağlayabilirdik. Genel OOP mantığı her yerde aynı.

main()'i incelersek, Person class'ından nesneyi deklare etmesi için bir pointer oluşturulmuş ve Engineer class'ından olan nesneyi point etmesi söylenmiş. İki class birbirinden farklı olmasına rağmen bu point işlemi düzgün bir şekilde olur çünkü Engineer class'ı Person class'ını inherit etmiştir. Engineer'a ait olan major değişkenini kullanamaz ama Engineer class'ının Person class'ından override ettiği ve set ettiği dğeişkenlerini kullanabilir. Genel OOP mantığı her yerde aynı.


Ayrıca bir başka örnek;

shared_ptr<Person> person = make_shared<Engineer>(25,"Serdar",555);

Override ve virtual kullanımı:

  • Base class'ta teknik olarak virtual kullanılması gereklidir.
  • Türetilen class'ta override kullanılması bakım (maintenance) için yararlıdır.
  • Türetilen class'ta virtual kullanılmasına gerek yoktur. Genel olarak kullanılmaz.
struct Base { virtual void foo() {} };
struct Derived: Base { void foo() override {} };
--------------------------------------------------------------------------------------------------------------------------

Inner Block


class T{
public:
         sting name;
         string surname;
};
void main(){
    
   Person p1;
   int value1 = 1;
{
   int value2 = 2;
   Person p2;
}
p2.name = "Serdar"  // derleme hatası
value2 = 12;              // derleme hatası
p1.name = "Hakan";  // sorunsuz çalışır.
value1 = 11;               // sorunsuz çalışır.
}

Yukarıdaki kodu inclediğimizde C'den farklı bir kullanım görmekteyiz. Bir fonksiyon içerisinde parantezler ile ayrılmış bir block gibi düşünülebilir. Örneği incelediğimizde Person p1 nesnesinin destructor'ı main fonksiyonu sonunda çalışırken, Person p2 nesnesinin destructor'ı kırmızı parantezin kapandığı yerde çalışır ve onun aşağısında kullanılamaz. (out of scope)

Aynı durum value2 integer değeri içinde geçerlidir. Parantez dışında bu değişken kullanılamaz.
Buna inner block denir.

--------------------------------------------------------------------------------------------------------------------------

Const kullanımı:

const'u eğer bir değişken veya class için tanımlarsak, üzerinde değişiklik yapmayacağımızı garanti ediyoruz manasındadır. Javada karşılığı final'dır.

const'u eğer bir fonksiyon parametresi olarak geçiyorsak, yine gelen parametre ne olursa olsun ( nesne veya değişken) üzerinde değişikşlik yapamayacağımızı söyler. 

Const bir nesneden bir method çağırmak için ( person.getName()) o methodun da const olarak tanımlanması gereklidir.

stringgetName() const {return name;}

Tabi const olarak methodu tanıtırsak, method içerisinde herhangi bir değer ataması yapılmamalıdır. Yoksa derleme hatası verir. Mesela

void setName (string name) const { name = name; } yapılamaz. Çünkü içerisinde atama yapılmış. Dğeişiklik yapılmadığını garanti etmesi gerekiyor.

Pointer const kullanımı:

Pointer const kullanımının 2 kullanımı ve manası vardır:

1.) int * const pcI // pointer to a const

      int i = 10, j=20;
      int *pI = &i;
      int const *pcI = pI;
Bu kullanımda cpI adress bilgisi değiştirebilir ama değeri *cpI değiştirilemez manasındadır.

yani 

*pcI = 4 // yapılamaz.
ama adresi değiştirilebilir.
pcI = &j; // yapılabilir.

2.) const int *pcI // const pointer

   int i = 10, j=20;
   int *pI = &i;
   const int *pcI = pI;

Bu kullanımda ise cpI adres bilgisi değiştirelemez ama *cpI değeri değiştirilebilir manasındadır.

cpI = &j; // yapılamaz

ama içerisindeki değer değiştirilebilir.

cpI = 4 ;//yapılabilir.

Sonuç olarak const 'tan sonra adres geldiyse adres (cpI), değer geldiyse değer( *cpI ) değiştirilemiyor.
--------------------------------------------------------------------------------------------------------------------------
Friend Kullanımı: 

Class içerisindeki private değişkenlere  erişim izni verilen fonksiyonlar için kullanılan keyword'tür. 
Örnek kod:

#include <iostream>
class Deneme{
private:
int N;
public:
Deneme(int x=0){N=x;};
int getN()const{return N;}
friend void print(Deneme a); // satır 8
};
void print (Deneme a){
std::cout << "Friend Sample";
std::cout << a.getN();
std::cout << a.N; // satır 13
}
int main(){
Deneme t(5); 
print(t);
// myN.print(t); Kullanımı yanlış
return 0; 
}

Yukarıdaki örneğe baktığımızda Deneme class'ı içerisinde private olarak belirlenmiş N değişkenine class dışından erişim sağlamak için bir friend void print() fonksiyonu tanımlanmıştır. Tanımlanma şekline dikkat ediniz.

--------------------------------------------------------------------------------------------------------------------------
static_cast vs dynamic_cast

Normal C deki castin işlemleri aynı şekilde c++ tada geçerlidir ama güveilir değildir. ( (int),
(Person *) vs). C de kullanılan bu casting işlemleri C++'ta kullanılması önerilmez.

static_cast

Derleme zamanında tür dönüşümleri için kullanılır. Programcı "ben bu nesnenin çalışma zamanında bile şu türden olduğuna eminim." demesi gibidir. Yani çalışma anında bu dönüşümün olup olmadığını belirleyemezsiniz, anlayamazsınız. Dolayısıyla tüm sorumluluk programcıya aittir. 

Örnek;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Hayvan
{
public:
void turIsmi(){cout << "Tür ismi: Hayvan" << endl;};
};
class Aslan: public Hayvan
{
public:
void turIsmi() {cout << "Tür ismi: Aslan" << endl;};
};
int main(int argc, char** argv)
{
Hayvan *h1 = new Hayvan();
Hayvan *h2 = new Aslan();
Aslan *h3;
h3 = static_cast<Aslan*>(h1);
h3->turIsmi();
delete(h1);
delete(h2);
return 0;
}

h1 pointer nesnesi Hayvan'nın değişken ve methodlarını, h2 pointer nesnesi ise Aslan'nın değişken ve methodlarını içerir.

h3 pointer nesnesi ise Aslan olarak deklare edilmiştir. Daha sonra static_cast ile h1 nesnesine cast edilerek adres verilmiştir. 
Buradaki duruma bakacak olursak h1 nesnesi Aslan özelliklerini içermeyebilir. Çünkü daha alt bir classtan üretilmiştir.( Hayvan). Eğer h3 nesnesi Havyanda olmayıp Aslanda olan bir method vs. çağırırsa kod patlar. 


dynamic_cast

Cast edilme esnasında, cast edilen nesnenin bir alt türden olup olmadığını öğrenmek için kullanılır. Geri dönüş değeri istenilen türe dönüştürme işlemi başarısız ise NULL'dır. Genel kullanım amaçlarından biri çalışma zmanında tür belirlenmesi içindir.
Örnek kod:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
using namespace std;
class Hayvan
{
public:
    virtual void turIsmi(){cout << "Tür ismi: Hayvan" << endl;};
};
class Aslan: public Hayvan
{
public:
    virtual void turIsmi() {cout << "Tür ismi: Aslan" << endl;};
};
int main(int argc, char** argv)
{
    Hayvan *h1 = new Hayvan();
    Aslan*h2 = new Aslan(); //burda aslında gizli bir tür dönüştürme işlemi var. Yine burda da dynamic_cast operatörü kullanılabilir.
    Hayvan *h3;
    if ((h3 = dynamic_cast<Aslan*>(h1)) == NULL)
        cout << "h1 Aslan türüne dönüştürülemez." << endl;
    if ((h3 = dynamic_cast<Aslan*>(h2)) == NULL)
        cout << "h2 Aslan türüne dönüştürülemez" << endl;
    h3->turIsmi();
    delete(h1);
    delete(h2);
  return 0;
}


Eğer dönüştürme işlemi başarısız olursa NULL döner. Bu sayede kontrol yapılabilir. Yukarıdaki koda bakılırsa 
26. satırda Hayvan-Hayvan

29. satırda ise Hayvan-Aslan casting vardır. Bu satıra dikkatli bakarsak, Aslan aslında bir Hayvan class'ını inheritace ettiğinden cast'in işlemi başarılı olur. eğer tam tersi olsaydı, Hayvan, Aslan'a cast edilmeye kalksaydı, Aslan Hayvandan türetilmiş bir class olduğundan bu işlemin sonucu NULL dönebilecekti.

Sonuç: 

Tür ismi: Aslan
--------------------------------------------------------------------------------------------------------------------------

STL Algorithms
Bu algoritmaları kullanmamızın nedeni, herhangi bir ekstra koda ihtiyaç duymadan rahat bir şekilde istediğimiz işlemleri yaptırmak.

count
Bir vektör içerisindeki aynı değerleri sayar ve geri döndürür. Aşağıdaki kod vektör'ün içinde kaç tane 2 sayısı var diye kontrol ediyor.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#include <iostream>
#include <algorithm>
using namespace std;

int main(int argc, char** argv)
{

vector <int > v{2,7,1,6,2,-2,4,0};

int two_cnt = 0;
int target = 2;

two = count (v.begin(), v.end(), target);


  return 0;
}
Sonuc = two_cnt = 2;


count_if

Lojik bir mantığa göre yapılan işlemin vektör içerisinde doğruluğunu kontrol eder ve kaç defa sağladığını bulup sayı olarak döndürür.
Aşağıdaki kod parçası bir vektörde kaç tane çift sayı olduğunu sayıp return ediyor.

Koda dikkat edilirse LAMBDA yapısı kullanılmıştır. Bu yapı diğer yazımda mevcuttur.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#include <iostream>
#include <algorithm>
using namespace std;

int main(int argc, char** argv)
{
vector <int > v{2,7,1,6,2,8,4,0};

int odds= 0;

odds = count_if(v.begin(), v.end(), [](auto element){return ((element % 2) != 0 ;) })


  return 0;

all_of

Koşulu hepsi sağlıyor mu diye kontrol edip geriye TRUE veya FALSE döndürür.

none_of

Koşulu hiç biri sağlamıyorsa geriye TRUE, herhangi biri sağlıyorsa geriye FALSE döndürür.

any_of

Koşulu herhangi biri sağlıyorsa TRUE, hiç biri sağlamıyorsa FALSE döndürür.

Aşağıdaki kodda vektör içinde hepsi çiftmi, hhiç biri çift mi, herhangi biri çiftmi kontrolleri yapılmıştır.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

#include <iostream>
#include <algorithm>
using namespace std;

int main(int argc, char** argv)
{

vector <int > v{2,7,1,6,2,-2,4,0};

bool allof;
bool noneof;
bool anyof;

allof = all_of(begin(v), end(v), [](auto element){return ((element % 2) != 0 ;) });
noneof= none_of(begin(v), end(v), [](auto element){return ((element % 2) != 0 ;) });
anyof= any_of(begin(v), end(v), [](auto element){return ((element % 2) != 0 ;) });

  return 0;
}

Sonuç:

allof = FALSE
noneof = FALSE
anyof = TRUE

find

Verilen bir sayının veya char değerinin ilgili vektör veya string te arama işlemini yaptırabiliriz. Bulduğu zaman aradığı değeri return ediyor.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <algorithm>
using namespace std;

int main(int argc, char** argv)
{

string s{"Hello I am a sentence"}; vector<int> v{ 2,4,6,6,6,1,3,-2,0,11,2,3,2,4,4,2,4 }; //find first a auto letter = find(begin(s), end(s), 'a'); char a = *letter; auto result = find(begin(v), end(v), 1); int sayi = *result;

auto result2 = find(result, end(v), 4); int sayi2 = *result2;

  return 0;
}

a = 'a'
sayi = 1;


değerini alır. Return olarak bir iteratör döner. Başka bir değişkene set etme işlemi pointer şeklinde olur. Result2 de 4 sayısını ararken hangi 4 sayısını bulduğuna bakarsak, find işlemini result'tan sonra yani 1 değerinden sonra yapıyor. Yani 4 saıyısını aradığı kısım vektörün kırmızı kısmı. Bulunan 4 sayısıda vektör'de yeşil olarak belirtilen 4 sayısıdır.












http://www.cplusplus.com/reference/algorithm/


--------------------------------------------------------------------------------------------------------------------------

Boost kütüphanesi kullanımı için:

std için;

#include <iostream>
#include <memory>
using namespace std;
. . .
shared_ptr<int> sp(new int(5));
cout << *p;  // Print "5"
Remember that you need to include the <memory> header. Template names such as shared_ptrare part of the std namespace, so you also need to include a using statement or use the std::prefix, as in std::shared_ptr.




--------------------------------------------------------------------------------------------------------------------------
Referance Variables in C ++


--------------------------------------------------------------------------------------------------------------------------
Kaynaklar: