C++学习(一)
C++和C的常量区别
1 //C的常量是伪常量,C++的常量是真常量 2 //const修饰的是指不可变的常量 3 //在C中: 4 int main(){ 5 const int number = 100; 6 int * numP = &number; 7 *nump = 10000;7 8 //此时 number已被改为10000 9 return 0; 10 } 11 在c++中可以运行c的代码,但是会出现编译通过,运行失败的问题。 12 //在C++中: 13 const修饰的常量不可以被修改,应去掉const修饰词
c++的打印
c++可以运行c的代码,反之,c不能加载C++的代码
//C++的日志输出, <<并不是运算符,只是操作符重载, endl相当于c中的 \n; //以下语句相当于 printf("c++学习 \n"); cout << "c++学习" << endl;
指针引用:&
- 不采用&,这连个函数的地址不同
- 采用&后,引用的同个内存地址
int number = 100; int & num2 = number; //num2 和 number 指针指向同个地址。一旦该地址值改变,所有的指针都获取同个值 num2 = 99;
#include <iostream> using namespace std; void numChange(int * num1,int * num2){ int temp = 0; temp = *num1; *num1 = *num2; *num2 = temp; } int main(){ int a = 666; int b = 888; numChange(&a,&b); cout << "a:"<< a << ", b: " << b << endl; return 0; } //log: a:888, b: 666
typedef
可以使用 typedef 为一个已有的类型取一个新的名字
typedef type newname;
静态转换static_cast
注意:静态转换不进行任何运行时类型检查,因此可能会导致运行时错误
int i = 10; float f = static_cast<float>(i); // 静态将int类型转换为float类型
常量引用
#include <iostream> #include <cstring> using namespace std; //保证代码的统一性 typedef struct{ char name[20]; int age; }Student; //此时若为s,则打印为 "王大斌",s和传入的student不是同一地址 //若为&s,则打印为 "隔壁老王" //若为const Student,则报错,const修饰的变量只读,不可更改 void insertStudent(Student &s){ //此时s是只读的,不可改变 strcpy(s.name,"隔壁老王"); } int main(){ Student student = {"王大斌",32}; insertStudent(student); cout <<"student name: "<< student.name <<endl; return 0; }
函数重载
void add(int num1,int num2){} //c语言中不支持函数重载,c++才支持函数重载 void add(int num1,int num2, int num3){} //默认形参写法,kt是借鉴于c++ void add( int num1,int num4 = 0){ }
注意:调用时会优先寻找带有默认参数的方法执行,跟函数顺序无关
先定义参数类型先抽象出来(无形参数),后边再补充逻辑
#include <iostream> using namespace std; void JNIMethod(int,double,char ){ cout << "先定义好,后边再升级" ; } int main() { cout << "Hello World" << endl; JNIMethod(1,0.1,'1'); return 0; }
1 //Student.h只写声明,不写实现;类似java的接口 2 #include <iostream> 3 using namespage std; 4 5 class Student { 6 private://从这里之下的代码(成员和函数)都是私有的 7 int age; 8 char* sex; 9 public://从这里之下的代码(成员和函数)都是公有的 10 void setAge(int age); 11 void setSex(char *sex); 12 int getAge(); 13 } 14 15 //Student.cpp 写实现 16 #include "Student.h" 17 18 void Student::setAge(int age){ 19 this -> age = age; 20 } 21 。。。。。。 22 23 //使用 24 #include "Student.h" 25 int main(){ 26 //打印 27 std::cout << age << std::endl; 28 ===============栈内开辟空间==================================== 29 Student studetnStack; 30 studetnStack.setAge(1); 31 cout << age << sex << endl; 32 33 ===============栈内开辟空间==================================== 34 35 Student * studentdump = new Student(); 36 studentdump.setAge(88); 37 //注意 new 和 delete对应。 38 39 delete studentdump;//表示销毁堆内分配的对象,必须执行此操作,否则会堆内存溢出。 40 studentdump = NULL; 41 }
构造函数和析构函数
构造函数:注意malloc时不会执行构造函数,所以请使用new创建对象
析构函数:~XX(),波浪线
1 #include <iostream> 2 3 using namespace std; 4 5 class Student{ 6 7 8 private: 9 int age; 10 char* sex; 11 12 public: 13 void setAge(int age); 14 void setSex(char * sex); 15 int getAge(); 16 char* getSex(); 17 Student(){ 18 cout<< "我是默认无参构造函数" << endl; 19 } 20 Student(int age): Student(age,'男'){ 21 cout<< "我是一个参构造函数, age: "<< age << endl; 22 } 23 24 Student(int age, char* sex){ 25 cout<< "我是两个参构造函数, age: "<< age << " , sex: "<< sex << endl; 26 this->age = age; 27 this->sex = sex; 28 } 29 //此代码等同上边代码,简写方法 30 // Student(int age,char* sex) : sex(sex),age(age) {} 31 //当delete时,析构函数一定会执行 32 ~Student(){ 33 //可以执行释放工作 34 } 35 }; 36 //注意,在java中,可以通过finalize(),java调用次函数,有可能会被回收,打上被回收的标记,放入队列中,并不是一定会被回收了
浙公网安备 33010602011771号