class circle
{
public:
double r;
double pi = 3.1415926;
double area = pi*r*r;
};
int main()
{
circle pi;
cout << "请输入area" << endl;
cin >> pi.r;
cout << pi.area << endl; //乱码
system("pause");
return 0;
}
总结: 从内存四区的角度,解释为什么会出现乱码
初始化的时候已经执行了,当时r是一个随机值,结果造成area变量是一个乱码。
当c1.area的时候,只是从变量所标示的内存空间中拿值;并没有执行pi*r*r
=========================================================================
所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:
1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下: std::cout << std::hex << 3.4 << std::endl;
2、使用using关键字。 using std::cout; using std::endl; using std::cin; 以上程序可以写成 cout << std::hex << 3.4 << endl;
3、最方便的就是使用using namespace std; 例如: using namespace std;这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写: cout <<hex << 3.4 << endl
在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。
#include "iostream"
using namespace std;
//1文件中iostream 没有引入标准的 std ; 需要我们程序员手工的写
//2 如果不写 using namespace std; 需要显示的引入std
void main31()
{
std::cout<<"namespace test"<<std::endl;
system("pause");
}
//3 定义命名空间
namespace namespaceA
{
int a = 10;
}
namespace namespaceB
{
int a = 20;
namespace namespaceC
{
struct Teacher
{
char name[32];
int age ;
};
}
}
//4 使用命名空间
//
void main()
{
using namespace namespaceA;
using namespace namespaceB;
cout<<namespaceA::a<<endl;
cout<<namespaceB::a<<endl;
//显示的, 写全
{
//namespaceB::namespaceC::Teacher t1;
//t1.age = 33;
}
using namespaceB::namespaceC::Teacher ;
Teacher t2;
t2.age = 36;
system("pause");
}
=========================================================================
register关键字的变化
register关键字请求“编译器”将局部变量存储于寄存器中
C语言中无法取得register变量地址
在C++中依然支持register关键字,C++编译器有自己的优化方式,不使用register也可能做优化,C++中可以取得register变量的地址。C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。
=========================================================================
struct类型的加强:
C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型
C++中的struct是一个新类型的定义声明
struct Student
{
char name[100];
int age;
};
int main(int argc, char *argv[])
{
Student s1 = {"wang", 1};
Student s2 = {"wang2", 2};
return 0;
}
=========================================================================
C++在C语言的基本类型系统之上增加了bool,bool类型只有true(非0)和false(0)两个值,C++编译器会在赋值时将非0值转换为true,0值转换为false。
=========================================================================
int main()
{
int a = 10;
int b = 20;
(a < b ? a : b) = 30;
printf("a = %d, b = %d\n", a, b);
system("pause");
return 0;
}
1)C语言返回变量的值 C++语言是返回变量本身,C语言中的三目运算符返回的是变量值,不能作为左值使用。
2)C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方。
注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用:(a < b ? 1 : b )= 30;
=========================================================================
int main()
{
int f = 0;
const int a = 1;
int const b = 1;
const int* c;
int* const d = &f;
const int* const e = &a;
return 0;
}
//第一个第二个意思一样 代表一个常整形数
//第三个 c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改)
//第四个 d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
//第五个 e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
int setTeacher_err( const Teacher *p)
//Const修改形参的时候,在利用形参不能修改指针所向的内存空间
void main()
{
const int a = 10;
int *p = NULL;
p = (int *)&a;
*p = 20;
printf("a:%d \n", a);
printf("*p:%d \n", *p);
system("pause");
}
//c语言的环境中 a打印结果为20
//c++语言的环境中 a打印结果为10 *p结果为20 证明了符号表的存在
C++编译器对const常量的处理,当碰见常量声明时,在符号表中放入常量,编译过程中若发现使用常量则直接以符号表中的值替换,编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间(兼容C),C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。
C++中的const常量与宏定义不同:const常量是由编译器处理的,提供类型检查和作用域检查;宏定义由预处理器处理,单纯的文本替换。
C语言中const变量是只读变量,有自己的存储空间。
C++中的const常量,可能分配存储空间,也可能不分配存储空间 ,当const常量为全局,并且需要在其它文件中使用(extern),会分配存储空间,当使用&操作符,取const常量的地址时,会分配存储空间,当const int &a = 10; const修饰引用时,也会分配存储空间。
=========================================================================