1.namespace名称空间:
C中的命名空间 在C语言中只有一个全局作用域 C语言中所有的全局标识符共享同一个作用域 标识符之间可能发生冲突 C++中的命名空间 命名空间将全局作用域分成不同的部分 不同命名空间中的标识符可以同名而不会发生冲突 命名空间可以相互嵌套 全局作用域也叫默认命名空间
三种使用方式 int a = 10; 方式一: std::out<<” a = “<< a << std::endl; 方式二: 加using std::out声明 方式三: 在全局区加 using namespace std; //这样声明可以让整个程序都可以使用命名空间中的变量定义 //如果该声明放在函数中,则仅本函数有效
2.自定义namespace:
namespace spaceA
{
int id;
namespace spaceB
{
struct Student
{
int id;
char name[
64];
};
}
namespace spaceC
{
struct Student2
{
int id;
char name[
64];
};
}
}
3.关于namespace的结论
1) 当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。若不引入using namespace std ,需要这样做。std::cout。 2) C++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h. 3) C++命名空间的定义: namespace name { … } 4) using namespace NameSpaceA; 5) namespce定义可嵌套。
4.C++变量随用随定义
C变量使用时必须提前定义
C:
int i =
0;
for(i=
0;i<
10;++i);
C++:
for(
int i=
0;i<
10;++i);
5.C++的变量检测增强
C:全局区
int g_a ;
int g_a =
10;
C++:
int g_a ;
int g_a =
10;
6.C++对结构体变量的优化:struct 类型增强
C:
struct Student
{
int id;
}Student;
struct Student st1;
st1.id =
10;
C++:
struct Student
{
int id;
}Student;
Student st1;
st1.id =
10;
7.C++严格检查函数的返回值
C:
foo() {
return 0;}
C++:
int foo() {
return 0;}
8.C++严格检查函数参数
C:
int fun1(
int a)
{
return 0;
}
fun1(
1,
2,
3,
4,
5);
C++:
int fun1(
int a)
{
return 0;
}
9.C++新增bool类型关键字
bool flag =
true;
flag =
20;
cout<<
"flag ="<<flag<<endl;
flag = -
30;
cout<<
"flag ="<<flag<<endl;
10.三目运算符的增强
C:
int main(
void)
{
int a =
10;
int b =
20;
*(a<b ? &a : &b ) =
50;
printf(
"a = %d, b = %d\n", a, b);
return 0;
}
C++:
#include <iostream>
using namespace std;
int main(
void)
{
int a =
10;
int b =
20;
(a < b ? a : b ) =
30;
printf(
"a = %d, b = %d\n", a, b);
return 0;
}
总结:
1). C语言返回变量的值, C++语言是返回变量本身 C语言中的三目运算符返回的是变量值,不能作为左值使用 C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方 2). 注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用(a < b ? 1 : b )= 30; 3). C语言如何支持类似C++的特性呢? *(a
11.C++对const变量的加强
1).
C中的
const变量时一个冒牌货,它可以通过万能的指针进行修改
const int a =
10;
int *b = &a;
*b =
30;
C++中
const int a =
10;
int *b = (
int *)&c;
*b =
30;
2).
C
const int a =
10;
int arr[a]={
0};
C++
const int a =
10;
int arr[a]={
0};
3).
C++中的
const常量类似于宏定义(相同点)
const int c =
5; 类似
#define c 5
C++中的
const常量与宏定义的不同(不同点)
const 常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器处理的,单纯的文本替换
4).
C语言中的
const变量
C语言中
const变量是只读变量,有自己的存储空间
C++中的
const常量
可能分配存储空间,也可能不分配存储空间
当
const常量为全局,并且需要在其它文件中使用,会分配存储空间
当使用&操作符,取
const常量的地址时,会分配存储空间
当
const int &a =
10;
const修饰引用时,也会分配存储空间
12.枚举类型增强
C:
enum MyEnum{ONE,TWO ,THREE ,FOUR ,FIVE};
void fun()
{
enum MyEnum e1 =
1;
if(e1 ==
1)
return;
}
C++
enum MyEnum{ONE,TWO ,THREE ,FOUR ,FIVE};
void fun()
{
enum MyEnum e1 =
1;
if(e1 == TWO)
return;
}
C++对C的拓展
13.引用
函数参数:值传递
void swap(
int a,
int b)
{
int temp = a;
a = b;
b = temp;
}
函数参数:地址传递
void swap(
int *a,
int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
函数参数:引用传递
void swap(
int &a,
int &b)
{
int temp = a;
a = b;
b = temp;
}
注意:
引用一经定义,必须初始化; 可对引用再进行引用 &在数据类型的后面表示定义引用,&前面没有数据类型表示取地址
14.引用的本质–>8引用的本质.cpp
1). //变量名,本身是一段内存的引用,即别名(alias).引用可以看作一个已定义变量的别名 int a = 10; int &b = a; 引用的性质:在定义时必须进行初始化,可以修改引用的值,但不可以将该引用应用于另一个变量
常指针的性质:int * const p;指针定义时必须初始化,可以修改指向的内存,但不可以修改指针的指向 其实在C++的内部实现中,引用是通过常指针来实现的
2).
struct A
{
int &a;
};
struct B
{
int *p;
};
cout<<
"sizeof(struct A)"<<
sizeof(
struct A)<<endl;
cout<<
"sizeof(struct B)"<<
sizeof(
struct B)<<endl;
3).
void Modify(
int *
const a)
{
*a =
200;
}
void Modify2(
int &a)
{
a =
100;
}
main::
int a =
0;
Modify(&a);
Modify2(a);
15.引用作为函数的返回值
引用作为返回值,不返要回局部变量的引用
int & getMem()
{
int a =
10;
return a;
}
main::
int &re = getMem();
int a = getMem();
**引用如果当函数返回值的话,返回一个引用,那么函数可以当成一个左值 **
int & getMem()
{
static int a =
10;
return a;
}
getMem()=
100;
16.指针引用
struct teacher
{
int id;
char name[
64];
};
int get_mem (
struct teacher ** tpp )
{
struct teacher * tp = NULL;
tp = (
struct teacher*)
malloc(
sizeof (
struct teacher ));
if ( tp == NULL) {
return -
1;
}
tp-> id =
100;
strcpy(tp ->name ,
"li4" );
* tpp = tp;
return 0;
}
int get_mem2 (
struct teacher * &tp )
{
tp = (
struct teacher*)
malloc(
sizeof (
struct teacher ));
if ( tp == NULL) {
return -
1;
}
tp-> id =
300;
strcpy(tp ->name ,
"wang5" );
return 0;
}
int main (
void )
{
struct teacher * tp = NULL;
get_mem(& tp);
cout <<
"id =" << tp ->id <<
", name = " << tp ->name << endl;
free_teacher(& tp);
cout <<
"---------------" << endl ;
get_mem2( tp);
cout <<
"id =" << tp ->id <<
", name = " << tp ->name << endl;
free_teacher2(tp );
system(
"pause" );
return 0;
}
struct teacher * tp = NULL;
int get_mem2 (
struct teacher * &tp );
struct teacher * &tp ---->
int &tp性质一样
struct teacher *就是一个类型名,给
struct teacher *的变量起一个别名:tp
17.const引用
const int a =
10;
const int & re = a;
const int &re3 =
10;
const int *p = &re3;
*((
int *)p) =
30;
cout<<
"*p = "<<*p<<endl;
cout<<
"re3 = "<<re3<<endl;
转载请注明原文地址: https://ju.6miu.com/read-34679.html