C/C++应该从关键字的个数、源文件、变量定义或声明位置、函数、缺省参数几个方面进行比较,如果你总是搞混,看了这篇文章会帮助到你。
C/C++从以下几个方面的比较:
关键字的个数:
C语言:C99版本,32个关键字
C++:C98版本,63个关键字
源文件:
C源文件后缀.c,C++源文件后缀.cpp,如果在创建源文件时什么都不给,则默认是.cpp
变量定义或声明位置:
C语言必须在第一行定义;C++不做要求
函数:
(1)返回值
C语言中,如果一个函数没有指定返回值类型,默认返回int型;
C++中,对于函数返回值的检测更加严格,如果一个函数没有返回值,则必须指定为void.
(2)参数列表
C语言中,如果函数没有指定参数列表时,默认可以接受任意多个参数;但在C++中,因为严格的参数类型检测,没有参数列表的函数,默认为void,不接受任何参数。
缺省参数:
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则,使用指定的实参。
1 2 3 4 5 | cout << a << endl;
}
int main(){ Test();
Test(100);
|
登录后复制
(1)全缺省参数:将所有参数的缺省值全部给出//代码
1 2 3 4 5 6 7 8 | { cout << a << "" << " " << b << "" << " " << c << endl;
}int main()
{
Test();
Test(100);
Test(100, 200);
Test(100, 200, 300);
|
登录后复制
(2)半缺省参数:规定,缺省值只能从右往左传//代码
1 2 3 4 5 6 7 8 9 10 11 12 13 | { 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)
}void Test5(int a = 1, int b = 2, int c )
}void Test6(int a = 1, int b , int c )
}void Test7(int a , int b = 2, int c )
}int main()
{
Test1();
|
登录后复制
注意:
1 2 3 | a. 带缺省值的参数必须放在参数列表的最后面。
b. 缺省参数不能同时在函数声明和定义中出现,只能二者则其一,最好放在函数声明中。
c. 缺省值必须是常量或全局变量。
|
登录后复制
C语言不支持缺省参数
函数重载
1 2 3 4 5 6 7 8 | {}int Add(int a, int b)
{ return a + b;
}int main()
{
Add(1, 2);
return 0;
}
|
登录后复制
1 | extern "C" int Add(char a, int b);
|
登录后复制
引用
C语言中函数有两种传参方式:传值和传址
传值:在函数调用过程中会生成一份临时变量用形参代替,最终把实参的值传递给新分配的临时变量即形参。
传值优点:函数的副作用不会影响到外部实参。
传值缺点:不能通过修改参数来改变外部实参。
传指:在函数调用过程中会生成一份临时变量用形参代替,最终把实参的地址传递给新分配的临时变量。
传指优点:节省空间,效率高,改变参数可以改变外部实参。
传指缺点:指针不安全,函数的副作用会影响外部实参。
C++中:
引用:
(1)概念:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它的引用变量共用同一块内存空间。
(2)形式:类型& 引用变量名=引用实体
1 2 3 4 5 6 | { int a = 10; int& ra = a; printf( "%p\n" , a); printf( "%p\n" , ra);
ra = 3; printf( "%d\n" , a);
return 0;
}
|
登录后复制
注:
1 2 3 4 | a. 引用在定义时,必须初始化。
b. 一个变量可以被多次引用。
c. 引用一旦引用了一个实体,就不能在引用其他实体。
d. 引用变量的生命周期比实体的生命周期短。
|
登录后复制
(3)常引用
1 2 3 4 5 6 7 | 常引用int main()
{ const int a = 1;
const int& ra = a; double b = 12.34;
const int& rb = b; printf( "rb=%d\n" , rb);
b = 5.0; printf( "b=%f\n" , b);
printf( "rb=%d\n" , rb);
|
登录后复制
(4)数组引用
(5)引用场景:
a.用引用作为函数的参数来改变实参。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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;
}
void Swap( const int& left, const int& right);int main()
{ int a = 10; int b = 20;
Swap(&a, &b);
Swap(a, b);
}
|
登录后复制
b.用引用变量作为函数的返回值 //代码
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 | 情形1:int& FunTest()
{ int a = 10; return a;
}int main()
{ int b = FunTest();
printf( "b=%d\n" , b);
printf( "b=%d\n" , b);
printf( "b=%d\n" , b);
return 0;
}
情形2:int& FunTest2()
{ int a = 10; return a;
}int main()
{ int& b=FunTest2();
printf( "b=%d\n" , b);
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);
printf( "rb=%d\n" , rb);
printf( "rb=%d\n" , rb);
printf( "rb=%d\n" , rb);
return 0;
}
注意:不能返回栈空间上的引用
|
登录后复制
传值、传指、引用 效率比较
1 2 3 4 5 6 7 8 9 10 11 12 | { int array [10000];
};void FunTest(BigType bt)
{
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
不同点:
引用必须要进行初始化;指针不作要求。
普通类型的指针可以在任何时候指向任何一个同类型对象;而引用一旦引用一个实体,就不能再引用其他实体。
指针++:指向下一个地址; 引用++:给数值++。
在sizeof中含义不同:引用结果为引用类型的大小;而指针始终是 地址*空间所占字节个数。
指针需要手动寻址;而引用通过编译器寻址。
引用比指针使用起来相对安全。
命名空间
在C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局命名空间中,会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。
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 | { int a = 30; void FunTest()
{ printf( "N1::FunTest()\n" );
}
}
{ printf( "::FunTest()\n" );
}
{ int a = 10; printf( "%d\n" , a); printf( "%d\n" , ::a);
::FunTest(); printf( "%d\n" , N1::a);
N1::FunTest(); return 0;
}
{ 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;
}
{ int b = 70; void Test()
{ printf( "N1::Test()\n" );
}
}
|
登录后复制
1 2 3 4 5 6 7 8 9 10 | { int a = 1; int b = 2; int c = 3;
}
{ int a = 4;
printf( "a=%d\n" , N1::a);
printf( "b=%d\n" , b);
printf( "c=%d\n" , c);
|
登录后复制
C++输入输出:
//代码
1 2 3 | { 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;
}
|
登录后复制
相关推荐:
C# 中的 == 和 equals()有什么区别
C# 中的 == 和 equals()区别
视频:C++视频教程
以上是C/C++区别有哪些?很多人都不知道的比较方法的详细内容。更多信息请关注PHP中文网其他相关文章!