国庆节快乐!仍然是每天进步一点点的一天。
C++是计算机视觉的重要的一部分,虽然在初始学习时Python应用比较广,但是大多数公司还是C++做计算机视觉类的比较多,因为C++可加密,所以我们来一起探索吧!看了这系列博客,将会学到C++的基本操作!(如果不敲代码,可能会一知半解)
目录
第五天 - 221003
6.函数重载,默认参数,static()。
6.1.函数重载
6.2.默认参数default parameter
6.3.static静态变量
示例1:
#include
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
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
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.总结
- 就算定义的名称相同,类型不同不同的话,也可以正常运算。
- 名称相同的函数中,会根据元素决定。
示例1:
#include
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
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
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:
图【2】静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化。
示例 1:查看函数中声明的静态的含义
#include
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
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
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
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
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
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
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++ 类的静态成员 | 菜鸟教程