C/C++는 키워드 개수, 소스 파일, 변수 정의나 선언 위치, 함수, 기본 매개변수 등을 비교해야 합니다. 만약 항상 헷갈린다면 이 글을 읽어보시면 도움이 될 것입니다. 다음과 같은 측면에서 C/C ++의 비교 전환 :
- 키워드의 흡수 키워드 :
-
C 언어 : C99 버전, 32 키워드 C ++ : C98 버전, 63 키워드
-
-
변수 정의 또는 선언 위치:
C 언어는 반드시 C++에서는 필요하지 않습니다.
함수: (1) 반환 값
C 언어에서 함수가 반환 값 유형을 지정하지 않으면 기본적으로 int 유형을 반환합니다. C++에서는 함수 반환 값 감지가 더 엄격합니다. 함수가 값을 반환하지 않으면 void로 지정해야 합니다.
(2) 매개 변수 목록
C 언어에서 함수가 매개 변수 목록을 지정하지 않으면 , 기본적으로 여러 매개변수를 허용할 수 있습니다. 그러나 C++에서는 엄격한 매개변수 유형 감지로 인해 매개변수 목록이 없는 함수는 기본적으로 void로 설정되고 어떤 매개변수도 허용하지 않습니다.- 기본 매개변수:
기본 매개변수는 함수를 선언하거나 정의할 때 함수의 매개변수에 대한 기본값을 지정하는 것입니다. 이 함수를 호출할 때 실제 매개변수가 지정되지 않으면 기본값이 사용되며, 그렇지 않으면 지정된 실제 매개변수가 사용됩니다.
//1.实现缺省参数void Test(int a = 50){ cout << a << endl; } int main(){ Test(); // 输出50 Test(100); // 输出100}
(1) 전체 기본 매개변수: 모든 매개변수의 모든 기본값을 제공 // 코드
// 实现全缺省参数void Test(int a = 1,int b = 2,int c = 3) { cout << a << "" <<" "<< b << "" <<" "<< c << endl; }int main() { Test();//1 2 3 Test(100);//100 2 3 Test(100, 200);//100 200 3 Test(100, 200, 300);//100 200 300}
(2) 준기본 매개변수: 기본값을 규정합니다. 오른쪽에서 왼쪽으로만 가능합니다. 왼쪽 패스 // code
// 实现半缺省参数 注:缺省值只能从右往左传void Test1(int a = 1, int b = 2, int c = 3) { cout << a << "" << " " << b << "" << " " << c << endl; }void Test2(int a , int b = 2, int c = 3) { cout << a << "" << " " << b << "" << " " << c << endl; }void Test3(int a , int b , int c = 3) { cout << a << "" << " " << b << "" << " " << c << endl; }void Test4(int a = 1, int b , int c = 3)//不能通过编译,因为它违背了缺省值只能从右往左依次来给这一规定{ cout << a << "" << " " << b << "" << " " << c << endl; }void Test5(int a = 1, int b = 2, int c )//不能通过编译,因为它违背了缺省值只能从右往左依次来给这一规定{ cout << a << "" << " " << b << "" << " " << c << endl; }void Test6(int a = 1, int b , int c )//不能通过编译,因为它违背了缺省值只能从右往左依次来给这一规定{ cout << a << "" << " " << b << "" << " " << c << endl; }void Test7(int a , int b = 2, int c )//不能通过编译,因为它违背了缺省值只能从右往左依次来给这一规定{ cout << a << "" << " " << b << "" << " " << c << endl; }int main() { Test1();//1 2 3}
참고:
a. 带缺省值的参数必须放在参数列表的最后面。 b. 缺省参数不能同时在函数声明和定义中出现,只能二者则其一,最好放在函数声明中。 c. 缺省值必须是常量或全局变量。C 언어는 기본 매개변수를 지원하지 않습니다
함수 오버로딩
- 함수 오버로딩은 동일한 이름의 여러 함수를 선언하는 것을 말합니다. 동일한 범위의 유사한 함수 동일한 이름을 가진 함수의 형식 매개변수 목록(수, 유형, 유형의 순서)은 달라야 합니다.
-
//函数重载void Add();void Add(int a);//行参个数不一样void Add(char b);//行参类型不同void Add(int a, char b);void Add(char a, int b);//行参类型的次序不同
- 단지 반환 값의 유형이 다를 뿐이며 이는 함수 오버로드를 구성할 수 없습니다.
-
//仅仅返回值的类型不同,是不能构成函数重载的void Add(int a, int b) {}int Add(int a, int b) { return a + b; }int main() { Add(1, 2);//因为这样会造成调用不明确,两函数都可以被调用 return 0; }
- C++에서 함수 오버로딩을 지원하는 이유: VS 편집기는 함수 매개변수의 유형을 하단의 함수 이름으로 컴파일하므로 원래 함수 이름은 다른 고유한 이름으로 대체됩니다.
-
int Add(int a, int b); // ?Add@@YAHHH@Zchar Add(int a, int b); // ?Add@@YADHH@Zchar Add(char a, char b); // ?Add@@YADDD@Z
- C 언어가 함수 오버로딩을 지원하지 않는 이유: 생성된 새 함수 이름은 여전히 동일합니다. _
- 만 추가하면 됩니다. C++에서는 함수가 C 언어 스타일로 컴파일됩니다. 함수 앞에
- extern "c"만 추가하면 됩니다.
extern "C" int Add(char a, int b);
Quote
C에는 두 가지 종류의 함수 매개변수가 있습니다. 언어 방법:
값으로 전달및 주소로 전달
값으로 전달: 함수 호출 프로세스 중에 임시 변수가 생성되고 형식 매개변수로 대체되며, 마지막으로 실제 매개변수의 값이 새로 할당된 임시 변수, 즉 형식 매개변수에 전달됩니다. 값 전달의 장점
: 함수의 부작용은 외부 실제 매개변수에 영향을 미치지 않습니다. 값 전달의 단점
: 외부 매개변수는 매개변수 수정으로 변경할 수 없습니다.
: 함수 호출 과정에서 임시 변수가 생성되어 형식 매개변수로 대체되며, 마지막으로 실제 매개변수의 주소가 새로 할당된 임시 변수에 전달됩니다. 손가락 전송의 장점
: 공간 절약, 고효율, 매개변수 변경으로 외부 실제 매개변수를 변경할 수 있습니다. 포인터 전달의 단점
: 포인터는 안전하지 않으며 함수의 부작용이 외부 매개변수에 영향을 미칩니다.
:
인용문: (1) 개념: 참조는 변수를 새로 정의하는 것이 아니라 기존 변수에 별칭을 제공하는 것입니다. 컴파일러는 참조를 위해 메모리 공간을 열지 않습니다. 변수는 참조 변수와 동일하며 동일한 메모리 공간을 공유합니다. (2) 형식:
유형 및 참조 변수 이름 = 참조 엔터티 //引用int main()
{ int a = 10; int& ra = a; printf("%p\n", a); printf("%p\n", ra);//ra和a的地址相同,说明ra和a是同一个实体,他们共用同一块内存空间
ra = 3; printf("%d\n", a);//3
return 0;
}
참고:
a. 引用在定义时,必须初始化。 b. 一个变量可以被多次引用。 c. 引用一旦引用了一个实体,就不能在引用其他实体。 d. 引用变量的生命周期比实体的生命周期短。
(3) 상수 참조
常引用int main() { const int a = 1; //int& ra = a;//编译会出错,因为实体a是常量 const int& ra = a; double b = 12.34; //int& rb = b;//编译会出错,因为类型不同 const int& rb = b; printf("rb=%d\n", rb);//rb=12 b = 5.0; printf("b=%f\n", b);//b=5.0 printf("rb=%d\n", rb);//rb=12 //b的值改变,但rb的值并没有随之改变,说明rb和b是两个不同的实体}
(4) 배열 참조
//数组引用int a[10];//数组a的类型为 int[10]int(&ra)[10] = a;
(5) 참조 시나리오:
a. 참조를 함수의 매개변수로 사용하여 실제 매개변수를 변경합니다.void Swap(int* pLeft, int* pRight) { int temp = *pLeft; *pLeft = *pRight; *pRight = temp; } void Swap(int& left, int& right) { int temp = left; left = right; right = temp; } //如果用引用时不想改变实参的值,则给引用前加const void Swap(const int& left, const int& right);int main() { int a = 10; int b = 20; Swap(&a, &b);//通过传地址来改变实参 printf(" a=%d ", a); printf(" b=%d\n", b); Swap(a, b);//通过引用来改变实参 printf(" a=%d ", a); printf(" b=%d\n", b); }
b. //코드의 반환 값으로 참조 변수를 사용합니다.
情形1:int& FunTest() { int a = 10; return a; }int main() { int b = FunTest();//将函数的返回值赋给了b printf("b=%d\n", b);//b=10 printf("b=%d\n", b);//b=10 printf("b=%d\n", b);//b=10 return 0; } 情形2:int& FunTest2() { int a = 10; return a; }int main() { int& b=FunTest2();//将函数的返回值作为实体, printf("b=%d\n", b);//b=10 printf("b=%d\n", b);//随机值 printf("b=%d\n", b);//随机值 return 0; } 情形3:int& FunTest3(int& a) { a = 10; return a; }int main() { int b; int& rb = FunTest3(b); printf("b=%d\n", b);//b=10 printf("rb=%d\n", rb);//rb=10 printf("rb=%d\n", rb);//rb=10 printf("rb=%d\n", rb);//rb=10 return 0; } 注意:不能返回栈空间上的引用
값, 포인터, 참조 전송 효율성 비교
//比较struct BigType { int array[10000]; };void FunTest(BigType bt)//传值或传址{}void FunTest(BigType& bt)//引用{}void TestFunTestRumTime() { BigType bt; size_t Start = GetTickCount(); for (i = 0; i < 1000000; i++) { FunTest(bt);//传值或传引用 FunTest(&bt);//传址 } size_t End = GetTickCount(); printf("%d\n", End - Start); }//此代码检测出传值最慢,而传址和引用速度快且用时差不多相同참조와 포인터의 차이점은 무엇인가요?
동일점:
- 목록 내용
- 기본 처리 방법은 동일하며 모두 포인터 형식으로 구현됩니다.
- 하단 레이어의 참조 변수에 해당하는 포인터 유형:
- 참조 변수 엔터티의 유형 * const
- 차이점:
- 참조는 초기화되어야 합니다. 포인터가 필요하지 않습니다.
- 일반 유형의 포인터는 언제든지 동일한 유형의 객체를 가리킬 수 있습니다. 참조가 엔터티를 참조하면 다른 엔터티를 참조할 수 없습니다.
- Pointer++: 다음 주소를 가리킵니다. Reference++: 숫자 값++를 제공합니다.
- 은 sizeof에서 다른 의미를 갖습니다. 참조 결과는 참조 유형의 크기이고 포인터는 항상 주소 * 공간이 차지하는 바이트 수입니다.
- 포인터는 수동으로 처리해야 하며 참조는 컴파일러에서 처리됩니다.
引用比指针使用起来相对安全。
命名空间
在C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局命名空间中,会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。
命名空间的定义
//命名空间namespace N1 { int a = 30; void FunTest() { printf("N1::FunTest()\n"); } }//N1的命名空间int a = 20;void FunTest() { printf("::FunTest()\n"); }//在全局作用域中int main() { int a = 10; printf("%d\n", a); printf("%d\n", ::a); ::FunTest(); printf("%d\n", N1::a); N1::FunTest(); return 0; }//命名空间的嵌套namespace N2 { int a = 40; void FunTest() { printf("N2::FunTest()\n"); } namespace N3 { int a = 50; void FunTest() { printf("N2::N3::FunTest()\n"); } } }int main() { N2::FunTest(); N2::N3::FunTest(); return 0; }// 在同一个工程里允许存在多个相同名称的命名空间,编译器最后会合成到同一个命名空间中namespace N1 { int b = 70; void Test() { printf("N1::Test()\n"); } }
说明
a.一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
b.没有名称的命名空间只能在当前文件中使用,它里面定义的变量相当于工程里面的全局变量。命名空间的使用
//命名空间的使用namespace N1 { int a = 1; int b = 2; int c = 3; /*void FunTest1() {} void FunTest2() {}*/}//法二:using N1::b;//法三:using namespace N1;int main() { int a = 4; //法一: printf("a=%d\n", N1::a);//a=1 printf("b=%d\n", b);//b=2 printf("c=%d\n", c);//c=3}
C++输入输出:
//代码
//C++输入输出#include <iostream>using namespace std;//std标准命名空间int main() { int a = 10; double b = 3.14; char c = 'c'; cout << a ; cout << b << '\n'; cout << c << endl; cout << a << " " << b << " " << c << endl; cin >> a ; cin >> b >> c; return 0; }// cout:标准命名空间重输出流对象 <<输出操作符 // cin:标准命名空间重输入流对象 >>输入操作符
相关推荐:
위 내용은 C/C++의 차이점은 무엇입니까? 많은 사람들이 모르는 비교방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

C# .NET 앱을 Azure 또는 AWS에 배포하는 방법은 무엇입니까? 답은 Azureappservice와 Awelasticbeanstalk를 사용하는 것입니다. 1. Azure에서 Azureappservice 및 AzurePipelines를 사용하여 배포를 자동화하십시오. 2. AWS에서 Amazon Elasticbeanstalk 및 Awslambda를 사용하여 배포 및 서버리스 컴퓨팅을 구현하십시오.

C#과 .NET의 조합은 개발자에게 강력한 프로그래밍 환경을 제공합니다. 1) C#은 다형성 및 비동기 프로그래밍을 지원합니다. 2) .net은 크로스 플랫폼 기능과 동시 처리 메커니즘을 제공하여 데스크탑, 웹 및 모바일 애플리케이션 개발에 널리 사용됩니다.

.NETFramework는 소프트웨어 프레임 워크이며 C#은 프로그래밍 언어입니다. 1..netframework는 데스크탑, 웹 및 모바일 애플리케이션 개발을 지원하는 라이브러리 및 서비스를 제공합니다. 2.C#은 .NETFramework 용으로 설계되었으며 최신 프로그래밍 기능을 지원합니다. 3..NetFramework는 CLR을 통해 코드 실행을 관리하고 C# 코드는 IL로 컴파일되어 CLR에 의해 실행됩니다. 4. .NETFramework를 사용하여 응용 프로그램을 신속하게 개발하면 C#은 LINQ와 같은 고급 기능을 제공합니다. 5. 일반적인 오류에는 유형 변환 및 비동기 프로그래밍 교착 상태가 포함됩니다. 디버깅을 위해서는 VisualStudio 도구가 필요합니다.

C#은 Microsoft에서 개발 한 최신 객체 지향 프로그래밍 언어이며 .NET은 Microsoft가 제공하는 개발 프레임 워크입니다. C#은 C의 성능과 Java의 단순성을 결합하며 다양한 응용 프로그램을 구축하는 데 적합합니다. .NET 프레임 워크는 여러 언어를 지원하고 쓰레기 수집 메커니즘을 제공하며 메모리 관리를 단순화합니다.

C# 및 .NET 런타임은 개발자가 효율적이고 강력하며 크로스 플랫폼 개발 기능을 강화하기 위해 긴밀히 협력합니다. 1) C#은 .NET 프레임 워크와 완벽하게 통합하도록 설계된 유형 안전 및 객체 지향 프로그래밍 언어입니다. 2) .NET 런타임은 C# 코드 실행을 관리하고, 쓰레기 수집, 유형 안전 및 기타 서비스를 제공하며, 효율적이고 크로스 플랫폼 운영을 보장합니다.

C# .NET 개발을 시작하려면 다음과 같은 것이 필요합니다. 1. C#의 기본 지식과 .NET 프레임 워크의 핵심 개념을 이해하십시오. 2. 변수, 데이터 유형, 제어 구조, 기능 및 클래스의 기본 개념을 마스터하십시오. 3. LINQ 및 비동기 프로그래밍과 같은 C#의 고급 기능을 배우십시오. 4. 일반적인 오류에 대한 디버깅 기술 및 성능 최적화 방법에 익숙해 지십시오. 이러한 단계를 통해 C#.NET의 세계를 점차적으로 침투하고 효율적인 응용 프로그램을 작성할 수 있습니다.

C#과 .NET의 관계는 분리 할 수 없지만 같은 것은 아닙니다. C#은 프로그래밍 언어이며 .NET은 개발 플랫폼입니다. C#은 코드를 작성하고 .NET의 중간 언어 (IL)로 컴파일하고 .NET 런타임 (CLR)에 의해 실행되는 데 사용됩니다.

C#.NET은 여러 응용 프로그램 개발을 지원하는 강력한 도구 및 라이브러리를 제공하기 때문에 여전히 중요합니다. 1) C#은 .NET 프레임 워크를 결합하여 개발 효율적이고 편리하게 만듭니다. 2) C#의 타입 안전 및 쓰레기 수집 메커니즘은 장점을 향상시킵니다. 3) .NET은 크로스 플랫폼 실행 환경과 풍부한 API를 제공하여 개발 유연성을 향상시킵니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

WebStorm Mac 버전
유용한 JavaScript 개발 도구
