C++随笔(三)
1.SStud 结构体
SStud ss =s2;//栈内拷贝构造
SStud sss(s2);//栈内拷贝构造
SStud *ps = new SStud(s2);//堆内的拷贝构造
拷贝构造函数:
只有一个构造参数是SStud &ss (指针),拷贝构造函数的特点是,只有一个参数而且类型是本类的对象的引用,ss实际是一个指针变量
2.析构函数必须没有返回值,而且不能有参数
一般构造了多少次,就会执行多少次析构
在栈中申请的,当存在多个构造函数的时候,是先构造的后析构,后构造的先析构
在堆中申请的要手动析构
3.教学课件内容:
§符号常量:
•使用宏定义#define定义: #define LIMIT 100
•
§C++提供了新的常量定义方式:
•使用const 修饰符定义: const int LIMIT=100;
•该常量是类型化的,有地址,可以用指针指向这个变量,不能修改。
•定义的变量是整数时,int可以被省略。
•函数参数也可以用const说明,用于保证参数在函数内部不被改动。
4.全局变量
•若希望在局部变量的作用域内,使用同名的全局变量,可以在该变量前加上“::”。
5.内联函数
§在函数说明前,添加关键字“inline”,该函数被声明为内置函数(或内联函数)。
•
•C++编译器使用内置函数体中的代码替代函数函数调用表达式,可以加快代码执行,减少调用开销。
•内置函数在调用之前应进行完整的定义(不能只有声明)。
•C++的内置函数与宏定义#define 具有相同的作用和相似的机理。
•函数较长或调用太频繁时,不适合定义为内置函数。
例如:
#include <iostream.h> inline float circle(float r) { return 3.1416*r*r; } int main() { for(int i=1; i<=3; i++) cout << "r="<< i << " area= " << circle(i) << endl; int x; cin >> x; return 0; }
6.动态分配内存
C++中使用运算符new 和delete
§运算符 new 用于内存的分配:
•p = new type;
§运算符 delete 用于释放已分配的内存空间:
•delete p;
•type是一个数据类型名,p是指向该数据类型的指针。
•new从称为堆的一块自由存储区中为程序分配一块sizeof(type)字节大小的内存,该内存的首地址被存于指针p中。
new和delete 都可以被重载,允许建立自定义的分配系统。
例如
View Code
1 int *p; 2 p=new int(99); 3 cout<<*p<<endl; 4 delete p;
为数组动态分配内存:
•int *pi = new int[10];
•… …
•delete [ ]pi;
使用new动态分配内存空间时,若没有足够的内存满足分配要求,new将返回空指针(NULL)
7.引用
引用的定义:
•定义引用的关键字是“type &”,其含义是“type类型的引用”,此引用与type类型的对象或变量的地址相联系。例如 int i=5; int &j=i; 它创建了一个整型引用,j是i的别名,i和j占用同一内存位置。
§定义引用时,必须立即对它进行初始化,不能定义完成后再赋值。
引用实际上是一种隐式指针,每次使用引用的变量时,可以不书写间接引用运算符,因而简化了程序。例如例题2-18。
引用参数C++提供引用,主要的一个用途就是将引用作为函数的参数。
1 #include <iostream.h>
2
3 int a[]={1,3,5,7,9};
4
5 int &index(int);
6
7 main()
8 {
9 index(2)=25;
10 cout << index(2);
11 cout<<"a[2]="<<a[2];
12 return 0;
13 }
14
15 int &index(int i)
16 {
17 return a[i];
18 }
引用返回值
函数可以返回一个引用,其主要的目的是:将该函数用在赋值运算符的左边
1 #include <iostream.h> 2 3 int &max(int &num1,int &num2); 4 int &min(int &num1,int &num2); 5 6 main() 7 { 8 int num1, num2; 9 cout <<"Enter the first number: "; 10 cin>>num1; 11 cout <<"Enter the second number: "; 12 cin>>num2; 13 max(num1, num2)=0; 14 cout<<"\nAfter putting zero in largest, the numbers are "; 15 cout<<"\n"<<num1<<" and "<<num2<<"\n"; 16 cout<<"Now, please enter two more numbers. \n"; 17 cout <<"Enter the first number: "; 18 cin>>num1; 19 cout <<"Enter the second number: "; 20 cin>>num2; 21 min(num1, num2)=0; 22 cout<<"\nAfter putting zero in smallest, the numbers are "; 23 cout<<"\n"<<num1<<" and "<<num2<<"\n"; 24 25 int x; 26 cin >> x; 27 28 return 0; 29 } 30 31 int &max(int &num1,int &num2) 32 { return (num1>num2)?num1:num2; } 33 int &min(int &num1,int &num2) 34 { return (num1<num2)?num1:num2; }
1 #include <iostream.h> 2 3 int &max(int &num1,int &num2); 4 int &min(int &num1,int &num2); 5 6 main() 7 { 8 int num1, num2; 9 cout <<"Enter the first number: "; 10 cin>>num1; 11 cout <<"Enter the second number: "; 12 cin>>num2; 13 max(num1, num2)=0; 14 cout<<"\nAfter putting zero in largest, the numbers are "; 15 cout<<"\n"<<num1<<" and "<<num2<<"\n"; 16 cout<<"Now, please enter two more numbers. \n"; 17 cout <<"Enter the first number: "; 18 cin>>num1; 19 cout <<"Enter the second number: "; 20 cin>>num2; 21 min(num1, num2)=0; 22 cout<<"\nAfter putting zero in smallest, the numbers are "; 23 cout<<"\n"<<num1<<" and "<<num2<<"\n"; 24 25 int x; 26 cin >> x; 27 28 return 0; 29 } 30 31 int &max(int &num1,int &num2) 32 { return (num1>num2)?num1:num2; } 33 int &min(int &num1,int &num2) 34 { return (num1<num2)?num1:num2; }
结构名、联合名、枚举名都是类型名,在定义变量时,C和C++不同,例如
enum bool {BOOL, TRUE};
struct string
{
char * ptr;
int length;
};
定义变量时,C++可以直接说明为:
bool done; string str;
而在C语言中,必须写成:
enum bool done; struct string str;