c++学习的一些记录

About 6 minstudyc++

实验程序

#include<stdio.h>
int main(void) {
    // 求出1~100之间所有每位数的乘积小于没位数的和的数。例如:13满足1*3<1+3。
    {
        int i,m,n;
        for(i = 10;i<100;i++) {
            m = i/10;
            n = i%10;
            if(m*n < m +n) {
                printf("%d\n", i);
            }
        }
    }
    printf("+++++++++++++++++++");
    // 求出1~100之间每位数的乘积大于每位数的和的数。例如数字26,数位上数字的乘积12大于数字之和8
    {
        int n,k=1,s=0,m;
        for(n=1;n<=100;n++){ 
            k=1;
            s=0;
            // 1
            m = n;
            while( m > 0 ){ //2
                k*=m%10;
                s+=m%10;
                // 3
                m = m/10;
            }
            if(k>s)
            printf("%d\n",n);
        }
    }    
    return 0;
}

函数和对象

程序基本构成

// first.cpp  // 注释行
#include <iostream>  // 标准输入输出的预处理命令(将头文件iostream加入到程序中),以#开头的都是预处理命令
using namespace std; // 使用所有标识符的命名空间
int main(){}   // 是开始执行程序的入口,不管main方法在程序的那个位置,总是先执行,一个程序中,只能有一个主程序。

指针、引用、常量

int *p = new int(10);  // 动态分配了一个int类型的变量,并将它赋值给了指针p
delelte p;  // 通过new分配的动态内存空间,必须通过delete运算符释放。
int& r = a;  // 引用,就是创建一个别名,对引用的操作就是对代表的数据对象的操作。不能引用null,引用是必须立即初始化。
const int * p;  // *p是常量,不能进行左值操作
int * const p = &a;   // p本身是常量,不能改变p的指向,内容可以改变
const int * const p = &a; // 指针p和p都不能作为左值。

析构函数

当对象消失时,应使用析构函数释放构造函数分配的内存。在对象的生存期结束时被自动调用。

~Point();  // 析构函数用~区分
// 一个类只能有一个析构函数且不能指明参数,不能返回任何类型,void也不行。

复制构造函数

Point(Point&);  //  复制构造函数

例子

友元

#include <iostream>
using namespace std;
class point{
    private:
        float x;
    public:
        void f(float a){x=a;}
        void f(){x=0;}
    friend float max(point&, point&);
};
float max (point& a, point& b){
    return a.x > b.x ? a.x:b.x;
}
int main(){
    point m, n;
    m.f(2);
    cout << max(m,n); // 异常max不是类的成员函数,是类的友元函数,不能用m.max(a,b)方式调用
    return 0;
}

指针

#include <iostream>
 
using namespace std;
 
int main ()
{
   // 指针演示
   int  var1;
   char var2[10];
 
   cout << "var1 变量的地址: ";
   cout << &var1 << endl;
   cout << var1 << endl;
   cout << var2 << endl;

   cout << "var2 变量的地址: ";
   cout << &var2 << endl;

   int *ch;

   cout << ch << endl;
 
   return 0;
}

形参交换

#include <iostream>
 using namespace std;
// 交换只是交换了形参的值,是无法达到交换值的效果 
 void swap1(int a, int b){
     int tmp;
     tmp = a;
     a = b;
     b = tmp;
 }
 int main(){
     int a = 1;
     int b = 2;
     swap1(a, b);
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     system("pause");
     return 0;
}

地址传输

#include <iostream>
using namespace std;
// swap2接受的参数是地址,我们传入地址,就可以直接操作实参的值了
void swap2(int *a, int *b){
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}

int main(){
    int a = 1;
    int b = 2;
    swap2(&a, &b);
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    system("pause");
    return 0;
}

指针

#include <iostream>
 using namespace std;
// int **value, 最接近value的是*,说明value是一个指针,在前一个是*,说明是一个指向指针的指针,这样是合法的,那么如何访问value代表的实际参数的值呢?很简单,用**value就可以了,记住*是一个操作符,如同&一样,不过&是取地址操作符,而*是取值操作符 
 void swap6(int **a, int **b){
     int tmp;
     tmp = **a;
     **a = **b;
     **b = tmp;
 }
 
 int main(){
     int a = 1;
     int b = 2;
     int *aPtr = &a;//指向数据的指针
     int *bPtr = &b;//指向数据的指针
     int **aaPtr = &aPtr;//指向指针的地址的指针
     int **bbPtr = &bPtr;//指向指针的地址的指针
     swap6(aaPtr, bbPtr);
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     system("pause");
     return 0;
}

引用

#include <iostream>
 using namespace std;
// int*&  value这样一个声明,我们从最接近value的符号看起,是个&,说明value是一个引用,它是一个什么引用呢?再看*,它是一个指针的引用,即指针的别名,我们用*value就可以访问到实参的值了。所以,其交换函数的内部逻辑跟int *是一样的 
 void swap5(int *&a, int *&b){
     int tem = *a;
     *a = *b;
     *b = tem;
 }
 
 int main(){
     int a = 1;
     int b = 2;
 
     int *aPtr = &a;
     int *bPtr = &b;
     int *&arPtr = aPtr;
     int *&brPtr = bPtr;
 
     swap5(arPtr, brPtr);
 
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     system("pause");
     return 0;
}


#include <iostream>
using namespace std;
// 引用即别名,通过引用也是可以直接访问到实参和控制实参的
void swap3(int& a, int& b){
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
}

int main(){
    int a = 1;
    int b = 2;
    swap3(a, b);    
        cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    system("pause");
    return 0;
}

析构函数用例

#include <iostream>
using namespace std;
class Point{
    private:
        int x,y;
    // 定义一个函数时,必须先要声明    
    public:
        Point();
        Point(int, int);
        ~Point();
};
// 定义不带参数的构造函数
Point::Point():x(0),y(0){
    cout << "默认" << x << "," << y << endl;
};
// 定义带两个参数的构造函数 :x(a),y(b)等同于x=a,y=b
Point::Point(int a, int b):x(a),y(b){
    cout << "赋值" << a << "," << b << endl;
};
Point:: ~Point(void) {
    cout << "析构函数" << endl;
};
int main() {
    // 构造器产生对象
    Point A;
    Point B(15, 16);
    // 数组对象
    Point C[2];
    Point D[2] = {
        Point(5,7), Point(8, 12)
    };

    Point *ptr1 = new Point;
    Point *ptr = new Point(10,23);
    // 删除内存空间中的对象
    delete ptr1;
    delete ptr;

    Point *po = new Point[2];
    delete []po;
};

构造器的初始化

#include<iostream>
using namespace std;
class object{
    private:
        int val;
    public:
        object():val(0){
            cout << "object的默认构造器" << endl;
        }
        object(int i) : val(i){
            cout << "object的带参构造器" << val << endl;
        }
        ~object() {
            cout << "objecd的析构函数" << val << endl;
        }
};
class container{
    private:
        object one;
        object two;
        int data;
    public:
        container(): data(0){
            cout << "container的默认构造器" << endl;
        }
        container(int i, int j,int k);
        ~container() {
            cout << "container的析构函数" << data << endl;
        }
};
container::container(int i, int j, int k):two(i), one(j) {
    data = k;
    cout << "container的带参构造器" << data << endl;
}
int main() {
    container obj, anObj(5,6,10);
    return 0;
}

虚函数

#include <iostream>
using namespace std;
class A{
    public:
        A(){
            cout << "A的构造函数" << endl;
        }
        virtual void func(){
            cout << "类A的虚函数" << endl;
        }
        ~A(){}
        virtual void fund(){
            cout << "类A的析构函数" << endl;
        }
};
class B : public A{
    public:
        B(){
            cout << "B的构造函数" << endl;
            func();
        }
        void fun() {
            cout << "类B的函数,开始了:";
            func();
        }
        ~B(){
            fund();
        }
};
class C : public B{
    public:
        C(){
            cout << "类C的函数,开始了:";
        }
        void func() {
            cout << "类C的fun函数" << endl;
        }
        ~C(){
            fund();
        }
        void fund(){
            cout << "类C的fund函数" << endl;
        }
};
int main() {
    C c;
    c.fun();
}
Last update:
Contributors: gaoqisen