C++ | 12天学好C++ (Day5)->结构图可视化、代码加通俗理解

国庆节快乐!仍然是每天进步一点点的一天。

C++是计算机视觉的重要的一部分,虽然在初始学习时Python应用比较广,但是大多数公司还是C++做计算机视觉类的比较多,因为C++可加密,所以我们来一起探索吧!看了这系列博客,将会学到C++的基本操作!(如果不敲代码,可能会一知半解)


第五天 - 221003

目录

第五天 - 221003

6.函数重载,默认参数,static()。

6.1.函数重载

6.2.默认参数default parameter

6.3.static静态变量


6.函数,默认参数static()

6.1.函数重载

示例1:

#include<iostream>
using namespace std;
int sum(int a, int b, int c) {
	return a + b + c;
}
double sum(double a, double b) {
	return a + b;
}
int sum(int a, int b) {
	return a + b;
}
int main() {
	cout << sum(2, 5, 33);
	cout << sum(12.5, 33.6);
	cout << sum(2,6);


}

结果:

 在主函数main中打印求和,sum不知道调用哪个sum函数,

示例2:

#include<iostream>
using namespace std;
int big(int a, int b) {
	if (a > b)return a;
	else return b;
}
int big(int a[],int size) {
	int res = a[0];
	for (int i = 1;i < size;i++)
		if (res < a[i])res = a[i];
	return res;
}

int main() {
	int array[5] = { 1,9,-2,8,6 };
	cout << big(2, 3) << endl;
	cout << big(array, 5) << endl;;


}

结果:

 示例3:

#include<iostream>
using namespace std;
int sum(int a, int b) {
	int s = 0;
	for (int i = a;i <= b;i++)
		s += i;
	return s;

}
int sum(int a) {
	int s = 0;
	for (int i = 0;i <= a;i++)
		s += i;
	return s;
}
int main() {
	cout << sum(3, 5) << '\n' << endl;
	cout << sum(3) << '\n' << endl;
	cout << sum(100)<<'\n' << endl;


}

结果:

6.1.总结

- 就算定义的名称相同,类型不同不同的话,也可以正常运算。

- 名称相同的函数中,会根据元素决定。

6.2.默认参数default parameter

示例1:

#include<iostream>
using namespace std;
void star(int a = 5);
void msg(int id, string = "");
void star(int a) {
	for (int i = 0;i < a;i++)cout << '*';
	cout << endl;
}
void msg(int id,string text) {
	cout << id << ' ' << text << endl;
}

int main() {
	star();
	star(10);
	msg(10);
	msg(10, "Hi");


}

结果:

 示例2:

#include<iostream>
using namespace std;
void f(char c=' ',int line=1);

void f(char c,int line) {
	for (int i = 0;i < line;i++) {
		for (int j = 0;j < 10;j++)
			cout << c;
		cout << endl;
	}
}


int main() {
	f();
	f('%');
	f('#', 5);


}

结果:

 示例3:

#include<iostream>
using namespace std;
class MyVector {
	int* p;
	int size;
public:
	MyVector(int n = 100) {
		p = new int [n];
		size = n;

	}
	~MyVector() { delete[]p; }

};

int main() {
	MyVector* v1, * v2;
	v1 = new MyVector();
	v2 = new MyVector(1024);
	delete v1;
	delete v2;


}

结果为空,减少多余代码。

 示例4:

  6.3.static静态变量

 图【2】静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化。

示例 1:查看函数中声明的静态的含义

#include <iostream>

using namespace std;

void Counter()
{
    static int cnt;  // static을 사용하면 마치 전역변수처럼 명시적 초기화 하지 않아도 묵시적으로 0으로 초기화함
    cnt++;
    cout << "현재 cnt: " << cnt << endl;

}

int main(void)
{
    for (int i = 0; i < 10; i++)
    {
        Counter();
    }

    system("pause"); // VC++ 에만 적용
    return 0;
}

结果:

示例 2:需要全局变量的情况

#include <iostream>

using namespace std;

int simObjCnt = 0;
int cmxObjCnt = 0;

class SoSimple
{
public:
    SoSimple()
    {
        simObjCnt++;
        cout << simObjCnt << "번째 SoSimple 객체" << endl;
    }
};

class SoComplex
{
public:
    SoComplex()
    {
        cmxObjCnt++;
        cout << cmxObjCnt << "번째 SoComplex 객체" << endl;
    }
    SoComplex(SoComplex& copy)
    {
        cmxObjCnt++;
        cout << cmxObjCnt << "번째 SoComplex 객체" << endl;
    }
};


int main(void)
{
    SoSimple sim1;
    SoSimple sim2;
    SoSimple();  // 임시객체. 주의 SoSimple sim3( )은 틀린 문법임.

    SoComplex com1;
    SoComplex com2;
    SoComplex com3 = com2;  // 복사생성자

    system("pause"); // VC++ 에만 적용
    return 0;
}

结果:

例3:静态成员变量(静态类变量)

  • static每个类只创建一个成员变量。因此,即使重复创建相同类型的类, static最开始创建的成员变量也是共享的。
#include <iostream>

using namespace std;

class SoSimple
{
private:
    static int simObjCnt;  
public:
    SoSimple()
    {
        simObjCnt++;
        cout << simObjCnt << "번째 SoSimple 객체" << endl;
    }
};

int SoSimple::simObjCnt = 0;  // static 멤버 변수의 초기화는 클래스 외부에서 함

class SoComplex
{
private:
    static int cmxObjCnt;
public:
    SoComplex()
    {
        cmxObjCnt++;
        cout << cmxObjCnt << "번째 SoComplex 객체" << endl;
    }
    SoComplex(SoComplex& copy)
    {
        cmxObjCnt++;
        cout << cmxObjCnt << "번째 SoComplex 객체" << endl;
    }
};

int SoComplex::cmxObjCnt = 0;  // static 멤버 변수의 초기화는 클래스 외부에서 함

int main(void)
{
    SoSimple sim1;
    SoSimple sim2;
    SoSimple();  // 임시객체 

    SoComplex com1;
    SoComplex com2;
    SoComplex com3 = com2;  // 복사생성자

    system("pause"); // VC++ 에만 적용
    return 0;
}

 结果:

 

 示例 4:静态成员变量的另一种方法

#include <iostream>

using namespace std;

class SoSimple
{
public:
    static int simObjCnt;  
public:
    SoSimple()
    {
        simObjCnt++;
    }
};

int SoSimple::simObjCnt = 0;  // static 멤버 변수의 초기화는 클래스 외부에서 함


int main(void)
{
    cout << SoSimple::simObjCnt << "번째 SoSimple 객체" << endl;
    SoSimple sim1;
    SoSimple sim2;

    cout << SoSimple::simObjCnt << "번째 SoSimple 객체" << endl;  // simObjCnt은 공유되어 진 메모리 영역
    cout << sim1.simObjCnt << "번째 SoSimple 객체" << endl;  // simObjCnt이 public으로 설정되어 접근가능
    cout << sim2.simObjCnt << "번째 SoSimple 객체" << endl;  // simObjCnt이 public으로 설정되어 접근가능

    system("pause"); // VC++ 에만 적용
    return 0;
}

 结果:

示例 5:静态成员函数 

  • static成员函数内只能调用成员static变量和成员static函数。

 

#include <iostream>

using namespace std;

class SoSimple
{
private:
    int num1;
    static int num2; // static 멤버 변수
public:
    SoSimple(int n) : num1(n) {}
    void Adder(int n) { num1 += n; }
    static void Adder2(int n); // static 멤버 함수. static 멤버 변수처럼 객체의 외부에서 공유됨
    int GetMember() { return num1; }
    static int GetStaticMember();
};

int SoSimple::num2 = 0;  // static 멤버 변수의 초기화는 클래스 외부에서 함
void SoSimple::Adder2(int n) { num2 += n; } // static 멤버 함수의 초기화는 클래스 외부에서 함
int SoSimple::GetStaticMember() { return num2; }

int main(void)
{
    SoSimple sim1(3);
    cout << sim1.GetMember() << endl;
    cout << sim1.GetStaticMember() << endl << endl;

    sim1.Adder(1);
    sim1.Adder2(2);
    cout << sim1.GetMember() << endl;
    cout << sim1.GetStaticMember() << endl << endl;

    SoSimple sim2(-3);
    cout << sim2.GetMember() << endl;
    cout << sim2.GetStaticMember() << endl << endl;

    sim2.Adder(1);
    sim2.Adder2(2);
    cout << sim2.GetMember() << endl;
    cout << sim2.GetStaticMember() << endl << endl;

    system("pause"); // VC++ 에만 적용
    return 0;
}

 结果:

示例 6:const 静态成员(全局常量声明)

#include <iostream>

using namespace std;

class CountryArea
{
public:
    const static int RUSSIA = 1707540;  // const static 멤버는 선언과 동시에 초기화 가능
    const static int CANADA = 998467;
    const static int CHINA = 957290;
    const static int KOREA = 9922;

};

int main(void)
{
    cout << "러시아 면적: " << CountryArea::RUSSIA << " Km^2" << endl;
    cout << "캐나다 면적: " << CountryArea::CANADA << " Km^2" << endl;
    cout << "중국 면적: " << CountryArea::CHINA << " Km^2" << endl;
    cout << "한국 면적: " << CountryArea::KOREA << " Km^2" << endl;

    system("pause"); // VC++ 에만 적용
    return 0;
}

结果:

 

示例 7:可变的

 mutable关键字const允许在函数(即只读函数)内异常改变值。尽可能避免使用。

#include <iostream>

using namespace std;

class SoSimple
{
private:
    int num1;
    mutable int num2;  // const 함수에 예외를 두어 그 함수 안에서 값의 변경 가능하게 함
public:
    SoSimple(int n1, int n2) : num1(n1), num2(n2) {}
    void ShowSimlpeData() const
    {
        cout << num1 << ", " << num2 << endl;
    }
    void CopyToNum2() const
    {
        num2 = num1;
    }
};

int main(void)
{
    SoSimple sm(1, 2);
    sm.ShowSimlpeData();
    sm.CopyToNum2();
    sm.ShowSimlpeData();

    system("pause"); // VC++ 에만 적용
    return 0;
}

 结果:

 参考文献:

【1】06-04. 프로젝트 04(예시코드) - C++ 언어

【2】 C++ 类的静态成员 | 菜鸟教程

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天|여름이다

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值