C ++オブジェクト指向の概要、メモリ分析、参照 - C ++のステージ2回のコアの記事(1)を理解するために取得

1.C ++メモリパーティションモデル

プロセスで実行されているC ++プログラムは、メモリには、次の4つのパーティションに分割されます

コード領域:プログラムのプログラムバイナリコード、コメントなどは、この領域に配置されます

グローバルエリア:記憶静的変数、グローバル変数、定数(文字列定数とCONST修飾定数)、この領域のデータは、プログラムの終了時に、オペレーティングシステムによって解放されます

using namespace std;
//不在任何函数内的变量是全局变量
int a = 10;
int b = 23;

int main() {
	//在某个函数内的变量
	int c = 12;
	cout << (int)&a << endl;
	cout << (int)&b << endl;
	cout << (int)&c << endl;

}

スタック領域:などのローカル変数、関数パラメータを格納するために使用、コンパイラによって自動的に解除され、割り当てられているので、それがリターンアドレススタック領域ではありません、

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

int* f() {
	int a = 10;
	return &a;//栈区不要返回地址。局部变量是由编译器自动释放和分配
}
int main() {
	
	int* p = f();
	cout << *p;//10 第一次编译器会做保留
	cout << *p;//不会打印10
}

ヒープ:私たちは、オペレーティングシステムのリリースによって、プログラムの終了を放出しない場合は、ストレージオブジェクト、割り当てられたプログラマによってリリース(new演算子を使用しては、後ほど紹介します)

C ++の新しいキーワードによりスタック領域にデータを開きます

#include <iostream>
using namespace std;
int* f() {
	/*
	*1.指针本身也是局部变量,存放在栈长中,但是保存的数据在堆中
	2.new关键字开辟一块堆区,返回的是该数据类型的指针
	*/
	int *a = new int(10);
	return a;
}
int main() {
	int* p = f();
	cout << *p;//10
	cout << *p;//10
	//3.堆区的数据程,序员可以通过该delete释放
	delete p;
	//cout << *p;异常
}

 あなたは新しい配列されている場合

//new一个数组
int* arr = new int[10];
//释放一个数组
delete[] arr;

ご注意ください

コード領域とグローバル領域は、それがすでに存在するときexeファイルの実行可能ファイルにコンパイルが、プログラムのexeファイルの実装後のスタック領域とヒープ領域が生成され、

2.なぜ除算メモリ(メモリ分割センス)

別のライフサイクルを与える異なる領域に異なるデータは、プログラミングの柔軟性を向上させます

3.参照

変数への参照を使用して某

#include <iostream>
using namespace std;

int main() {	
	int a = 10;
	/*1.定义引用的格式  数据类型 &别名=原名
	*2.引用必需要初始化
	*3.引用初始化后,不可更改
	*/
	int& b = a;
	cout << b;//10
}

前記事の修正は、転送アドレス引数は、値によって渡される引数は、参照パラメータ修正の関数として、引数、変更する複雑な引数のポインタを単純化するプロセスを変更しません

#include <iostream>
using namespace std;
void swap(int &a,int &b) {
	int temp = a;
	a = b;
	b = temp;
}
int main() {	
	int a = 10;
	int b = 20;
	swap(a,b);
	cout << a;//20
	cout << b;//10
}

 ローカル変数は、関数の戻り値として返すことができません

#include <iostream>
using namespace std;
int& f() {
	int a = 10;//栈区中的局部变量在函数执行完后释放
	return a;
}
int main() {	
	int &a = f();
	cout << a;//10 编译器保留
	cout << a;//不在是10
}

ローカル静的変数の場合は、返すことができます

#include <iostream>
using namespace std;
int& f() {
	static int a = 10;//栈区中的局部变量在函数执行完后释放
	return a;
}
int main() {	
	int &a = f();
	cout << a;//10
	cout << a;//10
}
#include <iostream>
using namespace std;
int& f() {
	static int a = 10;//栈区中的局部变量在函数执行完后释放
	return a;
}
int main() {	
	int &a = f();
	cout << a;//10
	cout << a;//10
	f() = 100;//如果函数的返回是一个引用,可以作为左值
	cout << a;//100
	cout << a;//100
}

リファレンスは、基本的にポインタ定数であります

int main() {	
	int a = 1;
	//内部发现是引用,自动转成指针常量 int * const b=&a;
	int& b = a;
	b = 2;//内部发现是引用,自动转成*b=20;
	cout << a;//2
	cout << b;//2
}

 const参照

#include <iostream>
using namespace std;
//使用const修改函数形参,防止误操作
void f(const int& a) {
	//a = 100;不允许修改
}
int main() {	
	int& b = 1;//引用本身需要一个合法内存空间,所以这行代码有误
	int a = 10;
	f(a);
}

 

4.機能の関連

機能に関する以前のシリーズC ++の知識の基礎は、一部の機能に高度な知識を追加するために、ここで説明しました

1.C ++の機能は、デフォルト値を持つことができます

#include <iostream>
using namespace std;
//1.c++中函数可以有默认值,并且某个位置有了默认值,那么从这个位置开始左到右都的有默认值
int f(int a, int b = 10,int c=20) {
	return a + b + c;
}
int main() {	
	int a = 10;
	//2.如果函数有默认值,当我们传值使用传递的值,不传值使用默认的
	cout<<f(a);//40
	cout << f(a, 20);//50
}
//3.声明和实现只能有一个有默认参数
int f1(int a, int b = 10);
int f1(int a, int b) {
	return a + b;
}

2.C ++関数のパラメータはプレースホルダプレースホルダを使用することができる、関数呼び出しは、この位置を埋めるために必要です

#include <iostream>
using namespace std;

//1.只写一个数据类型就是占位
void f(int a,int) {
	cout << "test";
}
//2.占位参数可以有默认值
void f1(int a, int=10) {
	cout << "test";
}
int main() {	
	int a = 10;
	f(a, 10);//占位参必须填补
}

3.関数のオーバーロード

定義:同じスコープの下で、異なるタイプまたはパラメータまたは逐次パラメータの異なる数が2つの異なる機能。このとき、この2つの関数は、同じ名前にすることができます。再利用性を向上させます

#include <iostream>
using namespace std;

void f(int a,int b) {
	cout << "test";
}

void f(int a) {
	cout << "test";
}
int main() {	
	int a = 10;
	f(a, 10);
}

注:関数は関数としてオーバーロードされていない状態の値を返します

4.重負荷条件などの基準があり、関数

#include <iostream>
using namespace std;

void f(int &a) {//int &a=10;不合法
	cout << "test";
}

void f(const int &a) {//const int &a=10;合法
	cout << "test111";
}
int main() {	
	int a = 10;
	f(a);//test
	f(10);//test111
}

5.関数のオーバーロード遭遇デフォルトパラメータ注

void f(int a,int b=10) {//int &a=10;不合法
	cout << "test";
}

void f(int a) {//const int &a=10;合法
	cout << "test111";
}
int main() {	
	int a = 10;
	f(a);//报错,出现二义性
}


おすすめ

転載: www.cnblogs.com/javayihao/p/11937691.html