标签:其它 pointer 指针 #define 机制 童鞋 int change value
最近学习算法和刷题基本都是用C++写的程序,在这个过程中,发现C++和Java在语法上有很多相同点,但也有很多不同点,而这些不同点对于已经掌握Java的程序员来说,理解C++代码可能会有些吃力甚至困难,在踩过了一个又一个坑后,我决定把这些不同记录下来,可能涵盖的不是很全,所以本文会持续更新。
// C++中:
MyClass* a = new MyClass();
delete a;
// Java中:
MyClass a = new MyClass();
// 方式一
MyClass* a = new MyClass();
delete a;
// 方式二
MyClass b();
int a(10); // 等效于 int a = 10;
与java不同,C++除了使用赋值语句初始化变量之外,还可以使用上述初始化表达式对变量进行初始化,其效果相同。
// 初始化表达式
class MyClass {
public:
const int a;
int b;
MyClass(int aVal, int bVal):a(aVal), b(bVal) {}
};
// 非初始化表达式,无法通过编译,编译时会报以下错误:
// ‘const int MyClass::a‘ should be initialized
class MyClass {
public:
const int a;
int b;
MyClass(int aVal, int bVal) {
a = aVal;
b = bVal;
}
};
这个语法其实就是上述第四点中的初始化表达式,但这里我们看到下面这种赋值方式在构造函数里面会报错,这又是为什么呢?因为这里我们的冒号初始化和赋值语句干的事情不太一样:在冒号初始化时,只有冒号后面有相应变量的初始化表达式,就会在为成员变量分配内存时进行初始化,所以常量a在分配内存时做了初始化操作,之后也没有被改变值,所以不会报错;而在使用赋值语句时,构造函数在执行到函数体时已经为a分配了内存但却没有对其进行初始化,因此就会报should be initialized编译错误了。
这种神奇的写法我第一次见的时候也是惊讶了一波。
在上面例子中我们看到了C++类的定义后面也要加分号;我们知道在Java中类定义的大括号后面都无需加分号。
之后查资料发现:
在C++中,除函数,及预编译指令外,其它的语句或代码段结尾都必须要加分号。其中预编译指令是指,以#开头的语句。常见的有,#include ,#define, #ifdef, #if, #elif, #else,#endif等。
C++的作用域符::用法有三,一一介绍如下
全局作用域符
int a = 3;
void test() {
int a = ::a;
cout << a << endl;
}
这里就是将全局变量a的值通过全局作用域符的方式访问到,然后将其值赋给test函数中的局部变量a。类作用域符
class MyClass {
public:
void sayHello();
};
void MyClass::sayHello() {
cout << "hello world!" << endl;
}
这里有点类似Java中定义接口和对接口进行实现;首先在类的定义中定义了一个函数sayHello,但是没有具体函数体,然后在类的定义外,通过作用域符,在函数sayHello前加了一个MyClass::,相当于告诉编译器,这个函数就是MyClass类的sayHello方法的具体实现。命名空间作用域符
std::cout << "hello world!" << endl;
这里std就是命名空间,这样的用法相当于using namespace std;
class MyClass {
public:
int a;
MyClass(int aVal):a(aVal){}
};
int main () {
MyClass obj(5);
MyClass* objPointer = new MyClass(3);
// 常规操作
cout << obj.a << endl;
// 取指针操作
cout << (*objPointer).a << endl;
// ->操作
cout << objPointer->a << endl;
// 取地址操作
cout << (&obj)->a << endl;
// new出来的对象别忘了释放内存哦
delete objPointer;
return 0;
}
在C++中:
->表示访问指针指向的对象的成员变量或者函数;
指针内容实在太多,这里就不赘述了,有兴趣的童鞋可以参考菜鸟教程
函数名前的const
const int getVal() {
const int a = 3;
return a;
}
int main() {
cout << getVal() << endl;
}
就是定义函数的返回类型,规定返回变量类型必须为const。函数名后的const(用于类的成员函数中)
class MyClass {
public:
int a;
MyClass(int aVal):a(aVal){}
void sayHello() const {
cout << "a value is: " << a << endl;
}
// 编译报错:assignment of member ‘MyClass::a‘ in read-only object
void changeA() const {
a = 5;
}
};
函数名后面的const表示是该函数为常成员函数,该函数不能修改对象内的任何成员变量,只能发生读操作,不能发生写操作。这样可以对成员变量起到保护作用。
标签:其它 pointer 指针 #define 机制 童鞋 int change value
原文地址:https://www.cnblogs.com/codernie/p/9133175.html