c++中关于class的问题
//我写一个简单的Student类class Student
{
public:
int age;
int math;
int english;
int score;
public:
int getAge()
{
return age;
}
void setM(int m)
{
math = m;
}
void setE(int e)
{
english = e;
}
int getS()
{
score = math + english;
return score;
}
};
int main()
{
Student s1, s2;
s1.age = 13;
s1.setM(95);
s1.setE(70);
s2.age = 14;
s2.setM(85);
s2.setE(85);
cout << "xx同学" << s1.getAge() << "岁,总分:" << s1.getS() << endl;
cout << "xx同学" << s2.getAge() << "岁,总分:" << s2.getS() << endl;
return 0;
}
//输出的结果是:
xx同学13岁,总分:165
xx同学14岁,总分:170
关于以上代码我想请教:
1. 为什么可以Student s1, s2, .... ; 为什么可以定义无数个s1, s2, s3,...是怎样实现的呢,Student在内存中是一个地址吗?如果Student这个类名是一个地址,那么是s1,s2指向了这个地址还是Student这个地址指向了s1,s2呢?
2. 不管是指针还是引用,我们常常会说到"指向"这个词,那么在内存中是如何实现"指向"的呢,两个不同的内存地址0x0011 0x0022 是怎么关联起来的,怎么互相指向的
3. 我们可以直接给 s1.age属性赋值的方式来修改age,为什么有的时候还要再写一个getAge()的成员函数呢,不是多此一举吗?
4. 有时候我会觉得,一个变量(变量可以是各种各样的类型)或者一个数值字面量,在内存中可以传来传去真的挺神奇,也很好玩,但是有时候也会被搞得很乱,一会儿是传值,一会儿是传地址
到底哪种情况传值哪种情况传地址,有没有一些好的分辨技巧,还是说就死记硬背呢?这个跟编译器设计的语法有关系吗?
5. 我在自学编程的时候也一直想搞清楚计算机最底层的东西,后来我了解了一些知识: 晶体管可以组成触发器,这些触发器可以组合成加法器或者减法器之类,它们可以实现最基础的算法,比如加减法,而乘除法呢又可以通过加减运算来转换,乘法做两次循环运算呢就可以实现平方运算,就这样,一直迭代,就可以组合成一个功能比较强大的计算器了,如果计算机的一切操作皆运算,那么封装功能又是如何实现的呢,不光是封装继承功能,编程语言里面还有许多奇奇怪怪的功能,难道这也只是晶体管的减法器减法器就能模拟出来的吗?是不是cpu里面不光有晶体管,还有其它的什么东西呢?
6. 我们的编程语言是不是可以理解为: cpu指令集的高级扩展呢? 假如说cpu有一百多条指令集,我们把这些指令集互相组合迭代,然后把组合好的具有特定功能的这些指令集封装成一个函数或者一个命令(本质是2进制数,只不过编译器帮我们翻译成了人能看懂的语言),这些东西是不是就是我们常说的各种编程语言c/c++/java/python等等呢?
7. 如果操作系统是根据cpu指令集发展而来的,那是不是说只要cpu的指令集和一个操作系统兼容,那么不管这个cpu是谁造的都可以运行这个操作系统,在操作系统上运行一样的程序呢?
8. cpu的指令集是刻在cpu上的还是存储在寄存器里面的呢?我们可以去修改指令集吗?如何查看cpu的每一条指令集的详细信息呢(包含说明和用法文档)?
[此贴子已经被作者于2018-7-30 21:23编辑过]