重温C++
Posted 客家族_祖仙教_小凡仙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重温C++相关的知识,希望对你有一定的参考价值。
C++
1 子函数可以把定义放在MAIN函数前, 实现在MAIN函数后
2 函数之间的值传和地址传方式
call()
vector<string> name;
string lastname
who_is(&name,&lastname);
cout<<name<<endl;
void who_is(vector<string> *p_firstname,string *p_lastname)
string l_v_str_firstname("曾");
string l_v_str_lastname("大侠");
*p_lastname=l_v_str_firstname;
p_firstname->push_back(l_v_str_firstname);
调用函数call把本地变量的name地址传给被调用函数who_is
被调函数声明为指针 string *p_name
给指针赋值 *p_lastname=l_v_str_firstname;
给指针赋地址 p_name=&l_v_str_firstname
被调函数who_is 不能把函数内部的变量传到外面去,因为函数调用完后就被清除了。
这样函数内部要把工作结果返回出去,一方面可以通过RETRUN 可惜只能返回1个。
要多个必须主调函数把外面的变量地址传进来,然后给这个地址空间赋值,真实的值。
上面指针比较容易让人混淆,主要是跟普通变量相比。
很容易给指针赋值写成了 p_name=l_v_str_firstname。这实际上把指针里面的地值替换成新的内存地址。
对指针是4个字节32位的存储空间,里面只存放内存地址。
另外个混淆的地方就是指针定义和指针使用 string *p 定义指针 *p= 取指针里面的值。
另还有个引用传值
call()
vector<string> name;
string lastname
who_is(name,lastname);
cout<<name<<endl;
void who_is(vector<string> &p_firstname,string &p_lastname)
string l_v_str_firstname("曾");
string l_v_str_lastname("大侠");
p_lastname=l_v_str_firstname;
p_firstname.push_back(l_v_str_firstname);
这里主调函数不用&方式把地址传进去,而被调函数通过&方式声明使用主调函数变量的地址
在被调函数内部直接使用该变量,声明形式的变量
p_lastname=l_v_str_firstname;
p_firstname.push_back(l_v_str_firstname);
直接赋值不用*来表示,访问成员函数不用-> 而代替的是.
这或许是C++避免让大家混淆吧!
这种方式干净简单不乱,建议使用。如果编辑存C就无法使用。
大家对C或者C++感兴趣,可以在自己的虚拟机上编程一下
linux c/c++ hello word
https://blog.csdn.net/ZengMuAnSha/article/details/5826949
这篇小仙的博客老早以前在LINUX下写的。
Linux下C++连接oracle数据库 OCCI 接口
https://blog.csdn.net/ZengMuAnSha/article/details/51438251
这篇也是在LINUX下使用ORACLE公司免费的IDE NETBEAN8 C++版本
然后再使用ORACLE公司提供的OCCI库,开发个ORACLE数据库的DEMO
最主要的是NETBEAN8可以支持中文版。有IDE支持很多配置易如反掌!
文中的11.2.0.4 SDK下载地址早已失效了
SDK下载地址:
https://download.oracle.com/otn/linux/instantclient/11204/instantclient-sdk-linux.x64-11.2.0.4.0.zip?AuthParam=1575559586_5112f43f5a3f136e263c2afa58b8d757
BAISC:
https://download.oracle.com/otn_software/linux/instantclient/195000/instantclient-basic-linux.x64-19.5.0.0.0dbru.zip
这两个就是OCCI库,都是免费下载的. 不过你只需要注册免费的ORACLE账号就行.
使用IDE在LINUX下编程,自然需要图形界面,LINUX下的XWINDOX系统,还有个GNOME桌面系统. 一般情况下我装系统都会带图形支持,然后INIT3切换到字符界面上. 我使用XMAGNER 的XPASSVIE 什么鬼的工具,可把NETBEAN导到WIN7在操作.
我百度网盘共享一个NETBEAN 不确定是否支持C++,你可以直接上ORACLE官方下.
https://pan.baidu.com/s/16vvlRqjBZkbYCRXKK5IVRg 提取码:l39j
当然你不想整那么多的话,可以直接在虚拟机中的Linux图形界面编程,可以不用XSHELL.
当然NETBEAN 8需要JDK8
我使用ORACLE用户在LINUX下安装这两个家伙的. 另外环境设置下参数
export PATH=$ORACLE_BASE/OPatch:$ORACLE_HOME/bin:$CRS_HOME/bin:$PATH:/sbin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
PATH最好是把JDK的路径放在最前面.因为虚拟机上的ORACLE也带JAVA.
ORACLE 11G 一般带JAVA7 你在LINUX下java -version 看下是否正确。
LD_LIBRARY_PATH 是库路径,主要调试的时候需要知道它在哪里。
这个主要是OCCI库的BASIC这个包解压的路径。
好了作为ODBA 你除了会PL/SQL,SHELL外 你还会C++ 你可看起来很装逼的语言:
下面是开发个类似ANSIBEL批量执行SQL在30台数据库服务器上
/*
* File: main.cpp
* Author: oracle
*
* Created on 2019年12月4日, 下午4:11
*/
#include <cstdlib>
#include <iostream>
#include <string>
#include <occi.h>
#include <vector>
using namespace std; //这个是C++标准库
using namespace oracle::occi;//这个是OCCI库 命名空间
/*
* 先把3个函数的声明放在主函数前
*/
void Conn_Db_Exec(string user,string pwd,string conn,string sql);
void read_db_conf(vector<string> &p_v_str_user,vector<string> &p_v_str_pwd, vector<string> &p_v_str_conn, string s_classA,string s_classB,string s_classC,string s_dbname);
void read_sql_conf(string &psqltext,string psql_id);
int main(int argc, char** argv) //sqlid,classA,classB,classC,dbname
vector<string> m_v_user; //定义3个字符串数组
vector<string> m_v_pwd;
vector<string> m_v_conn;
string m_s_sql_text; //定义6个字符串变量
string m_s_sql_id;
string m_s_classA;
string m_s_classB;
string m_s_classC;
string m_s_dbname;
for (int i=0;i<argc; i++) //显示你输入的参数
cout<<"Your input Parameter:"<<endl;
cout<<argv[i]<<endl;
if (argc>0)//把输入的参数赋值给变量们
m_s_sql_id =argv[0];
m_s_classA=argv[1];
m_s_classB=argv[2];
m_s_classC=argv[3];
if (argc==5)
m_s_dbname=argv[4];
else
m_s_dbname.clear();
read_db_conf(m_v_user,m_v_pwd,m_v_conn,m_s_classA,m_s_classB,m_s_classC,m_s_dbname); //读入数据库连接信息
read_sql_conf(m_s_sql_text,m_s_sql_id);//读需要执行的SQL
else cout<<"You not innput parameter"<<endl;
if (m_s_sql_text.size() >0 ) //以下是对连接信息和SQL的检验
if (m_v_user.size() >0)
if(m_v_user.size()==m_v_pwd.size() && m_v_user.size()==m_v_conn.size())
for (int i=0;i<m_v_user.size();i++) //没毛病的话就循环执行SQL
cout<<m_v_user[i]<<endl;
cout<<m_v_pwd[i]<<endl;
cout<<m_v_conn[i]<<endl;
// Conn_Db_Exec(m_v_user[i],m_v_pwd[i],m_v_conn[i],m_s_sql_text); //是针对30台ORACLE数据库的哟!
else cout<<"This Database Number is not as! user.size != pwd.size !=conn.size" <<endl;
else cout<<"Not Find any database info!"<<endl;
else cout<<"Not Find any SQL TEXT info!"<<endl;
//Conn_Db_Exec(main_user,main_pwd,main_conn,main_sql);
return 0;
//以下是读取数据库配置文件,把3个数组的地址传进来装东西的
void read_db_conf(vector<string> &p_v_str_user,vector<string> &p_v_str_pwd,
vector<string> &p_v_str_conn,
string s_classA,string s_classB,string s_classC,string s_dbname)
string str_user("scott");//这先暂时存在变量里,将来打算存在db.conf个文件中
string str_pwd("123456");
string str_conn("192.168.2.21:1521/SHARKDB");
p_v_str_user.push_back(str_user); //把从文件读到的信息放进数组中
p_v_str_pwd.push_back(str_pwd);
p_v_str_conn.push_back(str_conn);
str_user="system";
str_pwd="123456";
str_conn="192.168.2.21:1521/SHARKDB";
p_v_str_user.push_back(str_user);
p_v_str_pwd.push_back(str_pwd);
p_v_str_conn.push_back(str_conn);
/*
p_v_str_user->push_back(str_user);
p_v_str_pwd->push_back(str_pwd);
p_v_str_conn->push_back(str_conn);*/
//同上根据SQLID从配置文件获得SQL
void read_sql_conf(string &psqltext,string psql_id)
string l_str_sqltext;
l_str_sqltext="select sysdate from dual";
psqltext=l_str_sqltext;
//数据库连接执行函数,把上面得到的链接信息和SQL传过来
void Conn_Db_Exec(string user,string pwd,string strconn,string sql)
//以下是OCCI 4个重要指针变量 分别是环境,连接,语句,结果
Environment *env;
Connection *conn;
Statement *stmt;
ResultSet *rset;
// 定义4个本地变量承接参数,其实也没必要。
string str_user=user;
string str_pwd=pwd;
string str_conn=strconn;
string str_sql=sql;
env = Environment::createEnvironment(Environment::OBJECT); //环境初始化
try
conn =env->createConnection(str_user,str_pwd,str_conn);//创建连接
if(conn!=NULL)
cout<<"Connect Success"<<endl;
else
cout<<"Connect Failed!"<<endl;
stmt=conn->createStatement(str_sql); //创建语句
rset=stmt->executeQuery(); //执行语句,并返回结果
while(rset->next()) //结果循环打印行
string tr_day=rset->getString(1); //这里每个字段打印一下
cout<<"This Database date is :"<<tr_day<<endl;
catch(SQLException e) //异常处理
cout<<e.what()<<endl; //简单地显示异常,并关闭4个重要指针
stmt->closeResultSet(rset);
conn->terminateStatement(stmt);
env->terminateConnection(conn);
Environment::terminateEnvironment(env);
//最后还是释放4个指针。
stmt->closeResultSet(rset);
conn->terminateStatement(stmt);
env->terminateConnection(conn);
Environment::terminateEnvironment(env);
以上是关于重温C++的主要内容,如果未能解决你的问题,请参考以下文章